Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何获取垂死进程的调用堆栈,即找出进程是如何退出的_C++_Debugging_Windbg - Fatal编程技术网

C++ 如何获取垂死进程的调用堆栈,即找出进程是如何退出的

C++ 如何获取垂死进程的调用堆栈,即找出进程是如何退出的,c++,debugging,windbg,C++,Debugging,Windbg,我正处于一个独特的困境中,我的流程正在退出,没有抛出任何异常,只是默默地退出 我想知道进程退出时调用堆栈是什么,比如,谁在调用我进程上的exit(0) 这是一个本地C++应用程序,它是几百万行,我不可能知道事情出错的地方。 是否有这样的便利性,例如,如果我在Windbg下运行?您可以配置为在退出时转储进程的完整映像,以便进行后期调试。从概述中可以看出: 进程运行时自动转储 监控退出 WinDbg默认配置为在进程退出时中断,因此您所要做的就是连接到进程并等待。 当然,键入“k”可以在进程中断后调用

我正处于一个独特的困境中,我的流程正在退出,没有抛出任何异常,只是默默地退出

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

这是一个本地C++应用程序,它是几百万行,我不可能知道事情出错的地方。 是否有这样的便利性,例如,如果我在Windbg下运行?

您可以配置为在退出时转储进程的完整映像,以便进行后期调试。从概述中可以看出:

进程运行时自动转储 监控退出


WinDbg默认配置为在进程退出时中断,因此您所要做的就是连接到进程并等待。
当然,键入“k”可以在进程中断后调用堆栈。

Microsoft的Microsoft调试工具包附带了一个名为ADPlus的实用程序

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

语法如下所示:

ADPlus -p <process id> -crash -o <output path>
ADPlus-p-crash-o
在哪里

-p是传递进程ID的参数。您可以从process explorer获得该参数到TList(我想)。还有其他参数允许您指定进程名称,但您必须自己查找

-crash是告诉它在崩溃或遇到未处理的异常时生成一个小型转储

-o是要保存小型转储的目录的路径。ADPlus将要做的是在那里创建一个子目录,其中包含进程名称和时间戳

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

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

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

他需要一个触发器,这才是大问题。@Hans-我不理解这个评论。为什么退出时的完整进程转储在确定其退出原因时没有用处?文档似乎建议进程转储程序可以在进程退出时触发,因此可能不需要额外的触发器。哦,好的,没关系。希望他不需要时间机器+1.@Hans-我同意这可能是痛苦旅程中的第一步,但我发现这很有用,例如,找出什么线程导致堆栈溢出,以及它的调用堆栈。你确定它是由sys.exit()调用的,而不是被oom或其他什么东西杀死的吗?