在Linux平台上,使用C/C++打印一个进程的所有线程堆栈跟踪

3
我想要使用C/C++获取正在运行进程所有线程的堆栈跟踪。
我知道获取堆栈跟踪的不同方式:
1. 我们有backtrace()api,但是问题在于它仅提供当前线程的堆栈跟踪。是否有人知道如何将其与每个运行的线程关联起来?
2. 我尝试的第二种方法是使用pstack命令。 pstack以运行进程的pid作为输入,显示所有线程的堆栈。但是,问题在于它不是一个C / C ++ api,所以我们不能在我们的代码中使用它。 (当我学习时)pstack是一个shell文件,反过来使用了gdb的bt命令。
是否有人知道其他方法可以帮助我获取正在运行进程的所有线程的堆栈跟踪?

1
我将在 gdb 中使用 thread apply all bt - dlmeetei
你是使用 pthreads 还是其他线程实现? - Thomas
1个回答

2
也许你可以使用ptrace来实现。附加到除了打印堆栈跟踪的线程外的所有线程,然后你可以使用PTRACE_GETREGS获取寄存器值。接下来你可以执行堆栈展开操作(也许你需要.elf文件中存储的信息来可靠地完成这一操作)。请注意,如果一个线程正在创建/销毁其堆栈帧,则必须特别小心处理。并且你可能需要从elf中获取调试信息以可靠地完成此操作(如果你的代码编译时忽略了帧指针,则肯定需要这样做)。
手动完成这个任务并不容易,但是肯定是可以完成的。

1
谢谢回复,我在一个线程中使用pthread_kill向其他线程发送SIGUSR2信号,当那些线程接收到信号时,它们会传递给用户定义的信号处理函数。在该函数中,使用backtrace()打印线程堆栈。 - hjwsm1989

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接