【问题标题】:Get stack trace for C# app crashing on non-dev machine获取 C# 应用程序在非开发机器上崩溃的堆栈跟踪
【发布时间】:2012-06-21 14:33:23
【问题描述】:

我在没有安装 Visual Studio 的客户端计算机上安装了 C# windows 窗体应用程序。

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

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

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

我想查看异常消息和堆栈跟踪,以便诊断问题。

我已尝试安装“windbg”附带的 .Net SDK。我已经在 windbg 中运行了该程序,并设法让它说出“CLR 异常”。但是,我无法让 windbg 打印异常消息或堆栈跟踪。由于 DLL 加载消息,即使经过大量摆弄,它也不会加载 SOS 或 PSSCOR2。一定有更简单的方法!

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

该应用程序是 .Net 3.5 应用程序。该机器安装了 .Net 3.5 和 .Net 4。事件日志中没有任何内容(我可以找到)。

【问题讨论】:

  • 编写代码以捕获写入日志文件的所有异常。
  • 你有权力改变来源吗? windbg 是一个侦听器应用程序 - 它从各种来源中回显调试语句。没有黑魔法,也无法凭空变出输出。但是,如果您能够修改源代码,那么修改您的应用程序以输出调试消息非常简单。
  • @Pete:也许你的意思是不同的windbg?我拥有的(.Net SDK 附带的)是一个功能齐全(如果相当迟钝)的调试器,它可以设置断点、检查内存等。我只是无法让它打印异常......
  • @Rich,对不起,你完全正确。我错误地想到了dbmon。我讨厌变老!

标签: c# debugging clr windbg


【解决方案1】:

如果您无权访问源代码,那么您就有问题了。异常应该在 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
        }

【讨论】:

  • 这是一个很好的建议,谢谢。我确实可以访问源代码。我将在我怀疑有问题的代码周围添加一个 catch,并添加一个全局未捕获异常处理程序并重新编译。我们会看看是否能抓住它。 (我怀疑 DLL 加载问题,对于此类处理程序来说可能太低了。)
  • 作为一般措施,用 try/catch 和 log 错误包围主代码总是安全的。如果你喜欢,你可以使用 log4net。如果你没有时间至少记录到一个文件。小心 catch 中的代码写入文件,如果文件不存在则创建文件,如果文件存在则追加等,使其具有防御性。
  • 谢谢,我添加了一个全局处理程序来将异常写入事件日志,并且我捕获了我的 index-out-of-bounds 异常。
【解决方案2】:
  • 您可以通过将处理程序添加到以下事件,在代码中的某个位置捕获未处理的异常。然后,您可以记录或执行一些其他操作。

    AppDomain.UnhandledException

  • 您可以从任务管理器生成故障转储(右键单击 Processes 选项卡中的条目并选择 Create Dump File)并使用 WinDbg 加载它。运行!pe 命令应该会显示异常。您将需要构建中的 PDB 文件以及崩溃机器中正确版本的 SOS DLL。

【讨论】:

  • 如何从任务管理器生成故障转储?
  • 右键单击Processes 选项卡中的条目并选择Create Dump File。我会更新答案。
【解决方案3】:

使用 ADPlus 获取应用程序的故障转储,并将故障转储加载到开发机器上的 WinDbg 中:

http://blogs.msdn.com/b/webdav_101/archive/2008/09/04/howto-generating-a-crash-dump-with-adplus.aspx

http://support.microsoft.com/kb/286350

您也可以尝试设置远程调试(假设您有源代码):

http://msdn.microsoft.com/en-us/library/y7f5zaaa.aspx

【讨论】:

  • 这对我不起作用。我不知道为什么,但 adplus 没有记录任何异常。我认为它无法启动应用程序或其他东西。我不会再试一次,因为 cad 的回答为我解决了这个问题。无论如何,谢谢。
  • @Rich 抱歉,没有成功。一定有什么东西捕捉到了那个异常,然后显示了那个错误对话框,并调用了 Exit。如果这是发生的情况,用户会看到一个崩溃对话框,但 Windows 会看到一个有序的关闭,因此 ADPlus 不会触发。只是我的猜测。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
  • 2012-04-29
  • 2018-11-27
相关资源
最近更新 更多