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

时间:2010-11-09 11:31:31

标签: c# visual-studio visual-studio-2010 debugging

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

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

3 个答案:

答案 0 :(得分:13)

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

您可以阅读所有相关内容here

以下是您设置的方式:

  • 运行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

希望有所帮助。

答案 1 :(得分:10)

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

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

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

System.Diagnostics.Debugger.Break();

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

System.Threading.Thread.Sleep(30000);

答案 2 :(得分:0)

最终经过多次挖掘后,我意识到WPF是导致问题的原因。 Rudsen的博客揭示了answer.

在应用程序日志中会出现以下错误;

.NET Runtime 4.0错误报告

EventType clr20r3,P1 eobfrontend.exe,P2 1.0.0.0,P3 4cd95cc7,P4 presentationframework,P5 4.0.0.0,P6 4ba1f8db,P7 78ff,P8 0,P9 system.windows.markup.xamlparse,P10 NIL。

实现Rudsen评论“错误意味着解析xaml代码时出现运行时错误”。我按照“Open Debug> Exceptions”中列出的步骤激活“thrown”中的复选框“公共语言运行时异常”列。完成后,Visual Studio将暂停所有异常。“