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