在gdb中退出时生成堆栈跟踪 我的C++应用程序给了我一些奇怪的输出,但是它运行到完成,我想检查堆栈跟踪,但是因为它不是分段错误,所以很难精确地确定它在哪里。我曾尝试在退出、\u退出和中止上设置断点,但当我调用堆栈时,我得到了如下结果 #0 0x00002aaaab1a7620 in exit () from /lib64/libc.so.6 #1 0x000000000041f19e in main ()

在gdb中退出时生成堆栈跟踪 我的C++应用程序给了我一些奇怪的输出,但是它运行到完成,我想检查堆栈跟踪,但是因为它不是分段错误,所以很难精确地确定它在哪里。我曾尝试在退出、\u退出和中止上设置断点,但当我调用堆栈时,我得到了如下结果 #0 0x00002aaaab1a7620 in exit () from /lib64/libc.so.6 #1 0x000000000041f19e in main (),c++,perl,debugging,gdb,C++,Perl,Debugging,Gdb,这可能是因为我的应用程序有一个用sig包装的perl前端,是否有其他方法在完成时生成堆栈?您是在调试中构建的吗 添加一个带有“b函数\名称”的断点 按c键继续 键入bt以打印回溯跟踪 这就是堆栈跟踪的外观。main调用在结束时退出,并在exit内部打印堆栈跟踪。您无法通过堆栈跟踪找到发生事件的位置。一旦找到了发生事件的地方,就可以在那里获取堆栈跟踪,并找出执行是如何到达那里的 您要查找的任何输出都发生在退出之前,并且在获取堆栈跟踪时该函数已经返回。因此,您需要在输出发生之前设置断点。然后,您可

这可能是因为我的应用程序有一个用sig包装的perl前端,是否有其他方法在完成时生成堆栈?

您是在调试中构建的吗

  • 添加一个带有“b函数\名称”的断点
  • 按c键继续
  • 键入bt以打印回溯跟踪

这就是堆栈跟踪的外观。main调用在结束时退出,并在exit内部打印堆栈跟踪。您无法通过堆栈跟踪找到发生事件的位置。一旦找到了发生事件的地方,就可以在那里获取堆栈跟踪,并找出执行是如何到达那里的


您要查找的任何输出都发生在退出之前,并且在获取堆栈跟踪时该函数已经返回。因此,您需要在输出发生之前设置断点。然后,您可以逐行检查代码,找出哪一行执行输出。

您的调用堆栈仅仅意味着在
main()
中的
0x0411f19e
之前,没有人调用
exit()
。如果您对奇怪地省略的“奇怪的输出”提出疑问,也许您应该交互式地调试流程。什么奇怪的输出?也许知道这一点会建议在适当的位置放置断点。可能会重复