如何调试随机崩溃?

时间:2009-06-04 18:39:11

标签: c# winforms

我们有一个dotnet 2.0桌面winforms应用程序,它似乎随机崩溃。没有堆栈跟踪,通风日志或任何东西。它只是消失了。

有一些理论:

  1. 机器资源耗尽。有些人说你总会得到一个窗口处理异常或gdi异常,但是其他人说它可能只会导致崩溃。

  2. 我们在2个模块的非托管代码周围使用包装器。这两个模块中的异常都可能导致此行为。

  3. 再次,这是不可重复的,所以我想看看是否有任何建议如何更好地调试或任何我可以放在机器上以“抓住”崩溃,以帮助我们了解最新情况。< / p>

8 个答案:

答案 0 :(得分:6)

你最好的选择是购买John Robbins的书"Debugging Microsoft .NET 2.0 Applications"。你的问题可以比我们在这里输入的空间更深入。

答案 1 :(得分:3)

听起来像你需要先登录 - 也许你可以用PostSharp附加一个记录器到你的方法(see Log4PostSharp)。这肯定会减慢你的速度并产生大量的信息。但是你应该能够缩小有问题的代码...附加更多日志 - 删除其他日志。也许你可以稍后对这些部件进行压力测试。如果可疑部分足够小,您甚至可以在那里进行代码审查 我知道,你的问题是关于调试 - 但这也可能是一种方法。

答案 2 :(得分:2)

您可以使用来自SysInternals(现在是Microsoft的一部分)的进程监视器过滤到您想要监视的内容。这将为您提供一个良好的起点。只需从紧密焦点开始,或确保您有足够的空间存放日志文件。

答案 3 :(得分:1)

我同意Boydski的观点。但我也提出这个建议。如果您正在进行多线程,请仔细查看线程。我有一个像这样的错误,需要花很长时间才弄清楚,并且实际上最终得到了John Robbins的电话帮助。事实证明,使用线程进行了不正确的异常处理。

答案 4 :(得分:1)

运行您的应用程序,使用pdb文件,并附加WinDbg,运行。
Whem崩溃发生WinDbg停止应用。
执行此命令以生成转储文件:

.dump / ma c:\ myapp.dmp

分析的辅助工具是ADPlus

或试试这个:

Capturing user dumps using Performance alert
How to use ADPlus to troubleshoot "hangs" and "crashes"
Debugging on the Windows Platform

答案 5 :(得分:0)

你是否在启动GUI线程的'Application.Run'调用行周围有一个try / catch块?如果没有,请添加一个,并为那里抛出的任何异常进行一些登录。

您还可以编写Application.ThreadException事件并记录该事件以防止提供更多提示。

答案 6 :(得分:0)

答案 7 :(得分:0)

我过去的这种行为主要与COM对象没有被释放和/或线程问题有关。深入了解你已经在这里得到的建议,但我还建议你研究一下你是否正确地释放了非托管对象,这样它们就不会泄漏内存。