我目前正在开发一个处理COM dll中定义的对象的VB.net程序。 问题是,有时该对象会导致崩溃:抛出无法使用“Try Catch”处理的异常,并出现一个要求使用Visual Studio进行调试的对话框。 我想在此应用程序上禁用此对话框 。 所有其他.Net应用程序应在崩溃时显示此对话框。 顺便说一下,我使用visual Studio 2008。
答案 0 :(得分:1)
我最终选择了另一种方法而不是Hans的方法(请参阅注释):配置注册表以使用自定义程序作为调试器而不是调试器。该程序(我们称之为“DebuggerCaller.exe”)然后重定向到Dr Watson(或任何其他已注册的调试器),或者以崩溃进程的名称静默创建转储文件或日志。
如果是托管应用程序
您需要注册表中的设置
KEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\DbgJITDebugLaunchSetting = 2
这使得在崩溃的情况下调用在HKEY_LOCAL_MACHINE \ Software \ Microsoft.NETFramework \ DbgManagedDebugger的注册表中定义的应用程序。它可能不存在或等于16(默认值)。 在安装了Visual Studio及其jit调试器的计算机中,值为:
HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\DbgManagedDebugger
= "c:\WINDOWS\system32\vsjitdebugger.exe" PID %d APPDOM %d EXTEXT "%s" EVTHDL %d
应该用
之类的东西代替HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\DbgManagedDebugger
= "MyDebugCaller.exe" PID %d APPDOM %d EXTEXT "%s" EVTHDL %d
否则,该条目可能不存在或
HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\DbgManagedDebugger
= "drwtsn32.exe" -p %ld -e %ld
应该替换为
之类的东西HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\DbgManagedDebugger
= "*MyDebugCaller.exe*" -p %ld -e %ld
请注意,参数保持不变,这样我们的debuugger可以使用它们(尤其是PID)来确定进程名称,创建日志并在需要时转发到另一个调试器。
如果是原生应用
程序非常相似。 第一集
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Auto
= 1
定义本机应用程序调试器的条目键是
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger
如果安装了Visual Studio,则其值通常为drwtsn32.exe" -p %ld -e %ld
或"c:\WINDOWS\system32\vsjitdebugger.exe" -p %ld -e %ld
。
它应该改成这样:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger
= "*MyDebugCaller.exe*" -p %ld -e %ld
我希望这很清楚。 您可以在http://msdn.microsoft.com/en-us/library/2ac5yxx6%28v=vs.90%29.aspx
获取有关jit调试器设置的信息