到达正确的堆栈以获取异常

时间:2011-07-29 07:51:23

标签: c++ windows windbg

我正在开发一个拥有软件监视程序的应用程序。如果某个线程被锁定,或者等待超过一分钟,则看门狗会导致异常,以便下拉应用程序并重新启动它。

所以我正在查看其故障堆栈指向监视程序线程的dumpfiles。我需要确定真正的错误线程。

我正在寻找一般建议以及使用windbg识别真正的断层线程的可能策略。

3 个答案:

答案 0 :(得分:0)

应用程序验证程序是一个很好的工具。 http://msdn.microsoft.com/en-us/library/ms220948%28v=vs.90%29.aspx

应用程序验证程序会降低代码速度,并提供大量命令来分析问题。

一般来说,要在发布模式中找到问题,

  1. 为发布版本生成pdb
  2. 如果您的发布版在您的开发PC上运行,请打开visual studio并附上该过程(更简单的方法)
  3. 否则你需要获取转储并应用pdbs并找出..你应该为每个版本存档pdp文件。如果您有pdp文件,那么您可以使用调试工具轻松找到堆栈跟踪。如果您没有pdp,请提供新版本并保留pdb并从客户处获取minidump(如果您的客户具有灵活性)。

答案 1 :(得分:0)

在转储文件中,您没有所需的信息(cpu使用历史记录),但您可以列出所有线程并检查堆栈。这很可能会有所帮助,因为导致关闭的线程应该在等待或类似的事情中被阻止

答案 2 :(得分:0)

看门狗应该知道哪个线程没有及时响应,因为它是一个检查。你提到每个线程都有一个事件..也许看门狗线程的堆栈上还有一些信息可以帮助你推断哪个线程没有响应?

如果没有,那么只需使用〜* kc命令转储所有堆栈跟踪,看看是否可以找到任何可疑内容。

请记住,转储是应用程序状态的快照。这意味着概率方面,没有任何线程应该处于不经常运行或短暂运行的函数中。

一个技巧(对于相对确定的应用程序)是在非挂起状态下运行应用程序的一些转储。然后你就会知道堆栈跟踪应该是什么样子。当你检查挂起进程的转储时,某些线程的堆栈应该跳出来。