【问题标题】:Using gdb from inside process to get stack trace使用内部进程中的 gdb 获取堆栈跟踪
【发布时间】:2011-06-15 08:35:40
【问题描述】:

在我的代码中,我有一些运行时断言宏(我们称之为 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()/backtrace_symbols())
  2. 当调用 ptrace() 时,它会以某种方式影响其他线程吗?
  3. 如果系统资源不足(例如内存/磁盘空间),gdb fork 可能会失败吗?
  4. 如何只打印当前线程的堆栈跟踪? (我可以从 gcc backtrace() 获取当前方法的地址)

【问题讨论】:

    标签: debugging gcc gdb stack-trace


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

    【讨论】:

    • 违规线程是调用 runtime_assert 的线程。在我的情况下,其他线程的堆栈跟踪并不重要。
    • 嗯,是的,但我可能想要那个特定点的全貌。你可能想看看gcore
    【解决方案2】:

    我记得前段时间在 SO 上对此进行了类似的讨论。搜了一下论坛,发现是你问的,和你在这个问题中指出的一样。

    你看过nobar的回答吗?看来这正是您要寻找的。诀窍是使用 execlp 来调用 gdb 而不是 system

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 2012-01-21
      • 1970-01-01
      • 2018-07-19
      • 1970-01-01
      相关资源
      最近更新 更多