如何得到一个垂死过程的调用堆栈,即找出进程如何退出

时间:2010-12-03 21:11:22

标签: c++ debugging windbg

我处在一个独特的困境中,我的流程正在退出而不会抛出任何异常或类似的东西,只是默默地退出。

我想知道进程退出时调用堆栈是什么,例如,谁在我的进程上调用exit(0)。

这是一个本机C ++应用程序,数百万行,我无法弄清楚出错的地方。

是否有这样的便利性,例如,如果我在Windbg下运行?

3 个答案:

答案 0 :(得分:2)

您可以配置Process Dumper以在退出时转储进程的完整映像,以进行事后调试。来自概述:

  

进程正在自动转储   监控退出

答案 1 :(得分:2)

默认情况下,WinDbg配置为在进程退出时中断,因此您只需附加到进程并等待。 当然,一旦你的过程中断,就输入'k'来设置你的callstack。

答案 2 :(得分:0)

Microsoft的Microsoft Debugging Toolkit附带了一个名为ADPlus的实用工具。

ADPlus是一个命令行工具(显然它曾经是一个美化的vb脚本),可以做很多事情。但是你和我关心的是获得一个死亡过程的callstack。可以将AdPlus配置为在遇到未处理的异常时捕获外部进程的callstack。

语法如下:

ADPlus -p <process id> -crash -o <output path>

,其中

-p 是传入进程ID的参数。您可以从流程资源管理器到TList(我认为)。还有其他参数允许您指定进程名称,但您必须自己查找。

-crash 是告诉它在崩溃时遇到minidump,或遇到未处理的异常。

-o 是您希望保存minidump的目录的路径。然后,ADPlus将在那里创建一个子目录,其中包含进程名称和时间戳。

然后您可以运行您的应用程序,当它崩溃时,ADPlus将创建minidump,然后您的进程将退出。

microsoft Debugging工具包现在是Windows SDK安装的一部分。你去这里找到它:

http://www.microsoft.com/whdc/devtools/debugging/default.mspx

点击下载链接下载一个小应用程序,它将从网络上安装整个内容。 安装程序将为您提供许多选项,以便安装不同的组件。您可以忽略其中的大多数并仅安装调试工具包。