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

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

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

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

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

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

 System.Diagnostics.Debugger.Break(); 

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

 System.Threading.Thread.Sleep(30000); 

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

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

这是你如何设置它:

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

希望有所帮助。

经过多次挖掘,我意识到WPF是导致问题的原因。 Rudsen的博客揭示了答案。

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

.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”中列出的步骤操作,并激活“公共语言运行时exception”的“抛出”列中的复选框。完成后,Visual Studio将暂停所有exception。“