C# 获取非开发人员计算机上C应用程序崩溃的堆栈跟踪

C# 获取非开发人员计算机上C应用程序崩溃的堆栈跟踪,c#,debugging,clr,windbg,C#,Debugging,Clr,Windbg,我已在未安装Visual Studio的客户端计算机上安装了C windows窗体应用程序 当应用程序运行时,它会立即崩溃,并显示一个对话框 ProgramX已停止工作。一个问题导致程序停止正常工作。请关闭程序 对话框上的唯一按钮是关闭程序 我希望看到异常消息和堆栈跟踪,以便能够诊断问题 我已尝试安装windbg附带的.Net SDK。我已经在windbg中运行了这个程序,并设法让它说CLR exception。但是,我无法让windbg打印异常消息或堆栈跟踪。它不会加载SOS或PSSCOR2,

我已在未安装Visual Studio的客户端计算机上安装了C windows窗体应用程序

当应用程序运行时,它会立即崩溃,并显示一个对话框

ProgramX已停止工作。一个问题导致程序停止正常工作。请关闭程序

对话框上的唯一按钮是关闭程序

我希望看到异常消息和堆栈跟踪,以便能够诊断问题

我已尝试安装windbg附带的.Net SDK。我已经在windbg中运行了这个程序,并设法让它说CLR exception。但是,我无法让windbg打印异常消息或堆栈跟踪。它不会加载SOS或PSSCOR2,因为DLL加载消息,即使在大量修改之后也是如此。一定有更简单的办法

如果您的回答涉及windbg,请提供详细的分步说明,因为我尝试过这种方法,但失败了

该应用程序是一个.NET3.5应用程序。机器已安装.Net 3.5和.Net 4。我在事件日志中找不到任何内容。

如果您无法访问源代码,那么您就有问题了。异常应在windows事件中完成。也许例外正在被压制

如果您确实有权访问源代码,则可以使用TRY\CATCH和in-CATCH围绕开始代码,并将异常信息打印到文件中:

短信 ex.InnerException.Message 例如StackTrace 代码


使用ADPlus获取应用程序的崩溃转储,并将崩溃转储加载到开发计算机上的WinDbg中:

您还可以尝试设置远程调试,前提是您拥有以下源代码:

通过向以下事件添加处理程序,可以在代码中的一个位置捕获未处理的异常。然后,您可以记录或执行其他一些操作

您可以从任务管理器中生成崩溃转储,右键单击“进程”选项卡中的条目,然后选择“创建转储文件”并使用WinDbg加载它。跑步!pe命令应显示异常。您将需要来自构建的PDB文件和来自崩溃机器的正确版本的SOS DLL


编写将捕获写入日志文件的所有异常的代码。您有权更改源代码吗?windbg是一个监听器应用程序,它从不同的来源回显调试语句。这里没有黑魔法,它也不能从稀薄的空气中召唤出输出。但是,如果您能够修改源代码,那么修改应用程序以输出调试消息就非常简单了。@Pete:也许您指的是另一个windbg?我随.NETSDK提供的是一个功能齐全但相当迟钝的调试器,它可以设置断点、检查内存等。。我只是无法打印例外…@Rich,对不起,你说得完全正确。我不小心想到了迪蒙。我讨厌变老!这是个好建议,谢谢。我确实有权访问源代码。我将在我怀疑出错的代码周围添加一个捕获,并添加一个全局未捕获异常处理程序并重新编译。我们看看这是否能抓住它。我怀疑是DLL加载问题,这对于这样的处理程序来说可能太低了。一般来说,用try/catch和log错误围绕主代码总是安全的。如果你喜欢,你可以使用log4net。如果您没有时间,请至少登录到一个文件。对catch中的代码要非常小心,以便写入文件,并通过创建文件(如果文件不存在)、追加(如果文件存在)等方式进行防御。谢谢,我添加了一个全局处理程序来将异常写入事件日志,我捕获了我的索引越界异常。这对我不起作用。我不知道为什么,但adplus没有记录任何异常。我想它无法启动应用程序或其他东西。我不会再试了,因为cad的回答为我解决了这个问题。无论如何,谢谢。@Rich,很抱歉没有成功。一定是有什么东西捕获了该异常,然后显示了该错误对话框,并调用了Exit。如果是这样的话,用户会看到一个崩溃对话框,但windows会看到有序关闭,因此ADPlus不会触发。只是我的猜测。如何从任务管理器生成崩溃转储?右键单击“进程”选项卡中的条目,然后选择“创建转储文件”。我会更新答案。
        try
        {
            //Your code
        }
        catch (Exception ex)
        {
            //Log info to a file in same directory
        }