【问题标题】:C++ get backtrace of a different thread [duplicate]C ++获取不同线程的回溯[重复]
【发布时间】:2014-08-25 13:22:15
【问题描述】:

我希望了解我的软件中特定线程的状态,从另一个线程执行。 具体来说,我想知道它是否是 I/O 卡住了。 我正在考虑通过获取回溯来做到这一点(除非有人有其他想法?),因为我知道它应该坚持什么功能.. 但我不知道如何在不调用 SEGFAULT 处理程序的情况下获取该特定线程的回溯......但 gdb 能够做到(我怀疑他创建了 SEGFAULTS..)

有人可以帮忙吗?有什么想法吗?

[编辑] 所有 3 个答案都涉及 gdb,我知道我可以从 gdb 中做到,我想知道如何从软件中做到这一点(即使以某种方式链接到 gdb 库也是一个答案,但是如何?)

【问题讨论】:

  • 在 Linux 上,您可以轻松打开 /proc/<pid>/stat(或 /proc/<pid>/task/<tid>/stat)并读取堆栈和指令指针。您的平台要求是什么?
  • 如果你知道你认为你可能会被困在哪个函数中——你能不能在进入和离开该函数时设置和清除一个标志,并向其他线程做一个指示?
  • 你在哪个平台上需要这个?
  • @soren,不适用于高多线程故障检测。
  • 如果被检查的线程正在运行,您将无法可靠地执行此操作。

标签: c++ c multithreading pthreads backtrace


【解决方案1】:

我知道它应该卡在什么功能上..但我不知道 了解如何获取该特定线程的回溯

您可以获得所有线程的回溯,并尝试找到应该在回溯输出中卡住的函数。以下是如何在 gdb 中获取所有回溯:

(gdb) thread apply all bt

【讨论】:

  • 虽然很有趣(为此 +1),但 OP 专门询问如何在软件中而不是从 gdb 中做到这一点
  • 正如 Soren 评论的那样,我需要知道如何从软件而不是 gdb 中做到这一点。
  • @Alon,gdb 本身使用 libthread_db 库来列出线程,所以你可以在你的应用程序中做同样的事情。首先,您需要加载它(这不是很明显)。请参阅此博客了解如何加载它:timetobleed.com/…
【解决方案2】:

(gdb) info threads [将列出所有线程并指示您当前正在回溯的线程]

(gdb) thread apply all bt [将显示所有线程的回溯,以便您在切换到该线程之前查看哪个线程卡在您感兴趣的函数上]

(gdb) thread #threadno [将回溯切换到您感兴趣的特定线程,bt 将显示其回溯。]

参考http://www.delorie.com/gnu/docs/gdb/gdb_25.html

【讨论】:

    【解决方案3】:

    既然您知道您认为自己会卡在哪个函数上,您可以在该函数的开头设置一个断点。 GDB 允许您将一系列命令附加到断点时自动执行的断点,从而允许您打印断点时正在执行的线程的回溯。

    (gdb) break filename:line
    (gdb) commands
    Type commands for breakpoint(s) 1, one per line
    End with a line saying just "end"
    >info threads
    >bt
    >continue
    >end
    

    上面将为您提供线程列表,其中 * 由活动线程表示断点,然后是回溯。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多