我想要的是使用c / c ++获取所有线程的堆栈跟踪以运行进程。
我知道获得stacktrace的不同方式:
我们有backtrace()api,但问题是它只提供当前线程的堆栈跟踪。有没有人知道如何将它与每个正在运行的线程相关联?
我试过的第二种方法是使用pstack命令。 pstack接受输入作为运行进程的pid显示所有线程的所有堆栈。但问题是它不是C / C ++ api所以我们不能在我们的代码中使用它。 (当我学习的时候)pstack是一个shell文件,它反过来使用gdb' s bt命令。
有没有人知道不同的方法可以帮助我获得运行进程的所有线程的堆栈跟踪?
答案 0 :(得分:1)
也许你可以使用ptrace
。附加到所有线程(打印堆栈跟踪的线程除外),您可以使用PTRACE_GETREGS
获取寄存器值。然后你可以进行堆栈展开(也许你需要存储在.elf文件中的信息才能可靠地执行此操作)。请注意,如果线程只是创建/销毁其堆栈帧,则必须特别小心。并且您可能需要来自elf的调试信息才能可靠地执行此操作(如果使用省略的帧指针编译代码,您肯定需要这样做。)
手动执行此操作并非易事,但肯定可以完成。