在不附加 GDB 的情况下获取所有线程的堆栈跟踪

新手上路,请多包涵

有没有办法在不附加 GDB 的情况下打印所有线程的堆栈跟踪?

或者是否有一个命令可以用作 gdb 批处理模式来打印所有线程的堆栈跟踪?

原文由 Vivek Goel 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 760
2 个回答

GDB中有一个 thread apply all 命令:

 (gdb) thread apply all bt
Thread 12 (Thread 0x7f7fe2116700 (LWP 5466)):
#0  sem_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S:86
#1  0x0000000000425358 in ?? ()
...
Thread 1 (Thread 0x7f7feabc27c0 (LWP 5465)):
#0  0x00007f7fe76c5203 in select () at ../sysdeps/unix/syscall-template.S:82

遗憾的是,GDB 似乎无法从管道读取命令,因此要以批处理模式运行命令,必须使用临时文件:

 $ gdbbt() {
  tmp=$(tempfile)
  echo thread apply all bt >"$tmp"
  gdb -batch -nx -q -x "$tmp" -p "$1"
  rm -f "$tmp"
}
$ gdbbt $(pidof $SHELL)

然后你只会“暂时”附加 gdb 然后分离。

原文由 fork0 发布,翻译遵循 CC BY-SA 4.0 许可协议

elfutils 在其他实用程序中包括 eu-stack

>  eu-stack
>     Print a stack for each thread in a process or core file.
>
> ```

它比 gdb 或 pstack 快,后者只是 gdb 的一个 shell 脚本包装器。要打印堆栈跟踪运行 `eu-stack` 如下:

$ eu-stack -p 2209 PID 2209 - process TID 2209: #0 0x00007f53476b667b __poll #1 0x00007f5348f98e99 g_main_context_iterate.isra.23 #2 0x00007f5348f99232 g_main_loop_run #3 0x000055e604b1e56a main #4 0x00007f53475cc00a __libc_start_main #5 0x000055e604b1e76a _start TID 2223: #0 0x00007f53476b667b __poll #1 0x00007f5348f98e99 g_main_context_iterate.isra.23 #2 0x00007f5348f98fac g_main_context_iteration #3 0x00007f5348f98ff1 glib_worker_main #4 0x00007f5348fc0486 g_thread_proxy #5 0x00007f534813761b start_thread #6 0x00007f53476c2c2f __clone TID 2224: #0 0x00007f53476b667b __poll #1 0x00007f5348f98e99 g_main_context_iterate.isra.23 #2 0x00007f5348f99232 g_main_loop_run #3 0x00007f5349581b56 gdbus_shared_thread_func #4 0x00007f5348fc0486 g_thread_proxy #5 0x00007f534813761b start_thread #6 0x00007f53476c2c2f __clone

”`

原文由 ks1322 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题