在非开发机器上获取C#应用程序崩溃的堆栈跟踪

4
我在未安装Visual Studio的客户端机器上安装了一个C#窗体应用程序。
当运行该应用程序时,它会立即崩溃并显示对话框,其中显示以下内容:
“ProgramX已停止工作。问题导致程序停止正常工作。请关闭程序。”
对话框上唯一的按钮是“关闭程序”。
我想要查看异常消息和堆栈跟踪,以便诊断问题。
我尝试安装了带有“windbg”的.NET SDK。我在windbg中运行了程序,并设法使其显示“CLR异常”。然而,我无法让windbg打印出异常消息或堆栈跟踪。即使经过多次尝试后仍然无法加载SOS或PSSCOR2,因为存在DLL加载消息。肯定有更简单的方法!
(如果您的答案涉及windbg,请包括详细的逐步说明,因为我已经尝试过这种方法并且失败了。)
该应用程序是一个.NET 3.5应用程序。该机器安装了.NET 3.5和.NET 4。事件日志中没有任何内容(我找不到)。

编写代码以捕获所有写入日志文件的异常。 - Security Hound
你有更改源代码的能力吗?Windbg 是一个监听应用程序——它从各种来源回显调试语句。没有黑魔法,也不能凭空产生输出。但是,如果您能修改源代码,那么将应用程序修改为输出调试消息就非常简单了。 - PeteH
@Pete:也许你指的是另一个Windbg?我拥有的这个(随.Net SDK一起提供)是一个功能齐全(尽管相当晦涩)的调试器,可以设置断点、检查内存等等。我只是无法让它打印异常... - Rich
@Rich,非常抱歉,你说得完全正确。我想错了,我讨厌变老! - PeteH
3个回答

4
如果您没有访问源代码的权限,则会出现问题。异常应该在Windows事件中结束。也许异常被压制了。
如果您有访问源代码的权限,可以使用TRY\CATCH包围起始代码,并在CATCH中将异常信息打印到文件中:
- ex.message - ex.InnerException.Message - ex.StackTrace 代码:
        try
        {
            //Your code
        }
        catch (Exception ex)
        {
            //Log info to a file in same directory
        }

这是一个好建议,谢谢。我可以访问源代码。我将在我怀疑有问题的代码周围添加一个捕获块,并添加全局未捕获异常处理程序并重新编译。我们会看到是否能够捕获到它。(我怀疑是DLL加载问题,可能太低级无法使用此类处理程序。) - Rich
1
作为一般性的措施,将主要代码用try/catch包围并记录错误总是安全的。如果你想要更高级的操作,可以使用log4net。 如果你没有时间,至少要记录到文件中。在catch中写入文件时一定要非常小心,并通过创建文件(如果不存在)、追加(如果存在)等方式进行防御。 - Oscar Foley
1
谢谢,我添加了一个全局处理程序来将异常写入事件日志,并捕获了我的索引越界异常。 - Rich

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

    AppDomain.UnhandledException

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


我该如何从任务管理器生成崩溃转储? - Rich
在“进程”选项卡中右键单击条目,然后选择“创建转储文件”。我会更新答案。 - Thomas Bratt

2

那对我没用。我不知道为什么,但adplus没有记录任何异常。我认为它无法启动应用程序或其他原因。既然cad的答案已经解决了我的问题,我就不会再尝试了。无论如何,还是谢谢。 - Rich
@Rich 很抱歉它没有成功。一定是有东西捕获了那个异常,然后显示了错误对话框,并调用了Exit。如果是这样的话,用户会看到崩溃对话框,但Windows会看到一个有序的关闭,因此ADPlus不会触发。这只是我的猜测。 - JMarsch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接