我想将一堆线程转储到一个文件中。我怎么能在linux中这样做?如何找到堆栈的起始地址及其大小?请注意,我想从同一个进程(不使用ptrace,gdb或类似的东西)以编程方式执行此操作。
答案 0 :(得分:2)
如果你使用gnu c lib,你可以使用backtrace()函数
答案 1 :(得分:2)
使用 pthread_attr_getstack 功能;这会产生线程的堆栈地址和大小。
答案 2 :(得分:1)
使用gdb
通过其PID(进程ID)附加到正在运行的进程:
gdb -p 1234
然后输入bt
以获得回溯。
答案 3 :(得分:1)
Glibc有一个名为backtrace的功能,可以做你想要的。
http://www.delorie.com/gnu/docs/glibc/libc_665.html
http://www.linuxjournal.com/article/6391?page=0,0
上次我尝试过,结果并不完美,但有些有用。 YMMV。
答案 4 :(得分:1)
为什么你想转储线程的堆栈?
你想获得一些application checkpointing吗?如果你想要它,有一些库实现它,甚至是不完美的,但在实践中很有用。
关键是,即使您设法将线程的堆栈转储到文件中,我也不确定您是否能够对该文件进行有用的处理。您甚至无法使用这些堆栈重新启动应用程序,因为重新启动时(即使在相同的配置中)堆栈可能位于其他位置(因为ASLR),除非您将{0位数字写入{{ 1}}
我听说还有一些linux库强制正在运行的进程转储核心文件(稍后可以用/proc/sys/kernel/randomize_va_space
检查),而不会中止该过程。
调用堆栈非常脆弱,如果不采取预防措施就无法重复使用。
如果您只想检查您的调用堆栈,请查看Ian Taylor的libbacktrace。
请注意,多个检查点基础结构(包括SBCL的save-lisp-and-die
)无法恢复除主要基础之外的任何其他线程。这说明了管理gdb
- 堆栈的难度。