调试在启动时崩溃的C#可执行文件

won*_*nea 7 c# debugging visual-studio-2010 visual-studio

我正在尝试远程调试C#程序.连接到主机是没有问题的,我可以看到该机器上运行的所有进程,并可以连接到msvsmon.exe.

但是,我想调试的程序在启动时立即崩溃,让我没有时间依赖它.通过远程位置启动有问题的调试可执行文件也不会产生任何问题.如何在崩溃前附加调试器?

Iga*_*nik 13

我最喜欢在程序启动时附加调试器的技巧之一就是使用Image File Execution Options.它是一个注册表工具,允许您在执行之前将调试器附加到应用程序.同样的伎俩允许,例如,与更换您的Windows任务管理器进程资源管理器,或Notepad.exe使用的Notepad2.

你可以在这里阅读所有相关内容.

以下是您设置的方式:

  • regedit.exe
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
  • 创建一个名为exe的新密钥(例如:yourprogram.exe)
  • 在exe下创建一个新的字符串值.字符串值的名称是Debugger,值是vsjitdebugger.exe

运行可执行文件时,您将看到Just In Time提示,要求您选择调试器:

vsjitdebugger

打开此对话框时,远程连接到您的进程,然后按No对话框.

希望有所帮助.


Dir*_*mar 10

发布时崩溃可能是由于缺少依赖性.fuslogvw.exe在启动应用程序之前运行,并查看是否有任何绑定操作失败.

如果这没有帮助,通常将诊断日志记录到位是一种好习惯.您可以使用专用的日志库,例如log4net,或者至少您应该使用最简单的日志记录形式System.Diagnostics.Trace.您可以通过在app.config中配置跟踪侦听器或使用第三方工具(如Sysinternals中的调试器或DebugView)来侦听跟踪消息.

如果您确实想要附加调试器,可以通过编程方式插入断点:

System.Diagnostics.Debugger.Break();
Run Code Online (Sandbox Code Playgroud)

我还没有检查它是如何工作的远程调试器,但作为最后的手段,您可以让您的应用程序睡眠足够长,以允许您附加调试器:

System.Threading.Thread.Sleep(30000);
Run Code Online (Sandbox Code Playgroud)