在内部进程中使用gdb来获取堆栈跟踪

时间:2011-01-25 17:05:07

标签: debugging gcc gdb stack-trace

在我的代码中,我有一些运行时断言宏(让我们称之为runtime_assert)。 这应该是多线程应用程序。

当条件传递求值为false时,runtime_assert通过转储堆栈跟踪终止程序,然后调用_exit()。

您可能知道,转储堆栈跟踪不是一项简单的任务(How to get a stack trace for C++ using gcc with line number information?)。

这个想法是通过调用system()来调用带有进程pid的gdb。

  1. 一般来说这是个好主意吗? 或者最好使用仅处理工具来获得回溯? (例如gcc
    回溯()/ backtrace_symbols())
  2. 当调用ptrace()时,它会以某种方式影响其他线程吗?
  3. 如果系统资源不足(例如内存/磁盘空间),gdb fork可能会失败吗?
  4. 如何仅打印当前线程的堆栈跟踪? (我可以从gcc backtrace()获得当前方法的地址)

2 个答案:

答案 0 :(得分:2)

  1. 不要认为这是一个好主意 - 当system()完成时,GDB附加其他线程远远超出了问题点。在这种情况下,我实际上甚至不认为困扰堆栈跟踪是值得的(当你将应用程序提供给一些“不太复杂”的用户时,它可能会有所帮助,并且你从中得到的任何信息是有用)。在这里,我只是abort()并且有一个很好的核心文件可以仔细阅读。
  2. 我不知道这是否在任何地方指定 - 我怀疑它是依赖操作系统和线程库的(如果我在这里错了,请有人纠正我。)
  3. 是的,它可能会失败(尽管核心文件也是如此)。
  4. 我相信这可以通过一些gettid()和GDB初始文件以及用户定义的命令技巧来完成,但同样,不要以为我会打扰。

答案 1 :(得分:0)

我记得前段时间对SO的类似讨论。在搜索论坛后,我发现是你问过的,这是你在这个问题中指出的那个主题。

你见过nobar的回答吗?它似乎正是你在寻找的。诀窍是使用 execlp 来调用gdb而不是 system

How to get a stack trace for C++ using gcc with line number information?