如何转储线程堆栈

时间:2011-10-27 12:44:24

标签: c linux x86

我想将一堆线程转储到一个文件中。我怎么能在linux中这样做?如何找到堆栈的起始地址及其大小?请注意,我想从同一个进程(不使用ptrace,gdb或类似的东西)以编程方式执行此操作。

5 个答案:

答案 0 :(得分:2)

如果你使用gnu c lib,你可以使用backtrace()函数

http://www.gnu.org/s/hello/manual/libc/Backtraces.html

答案 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

请注意,多个检查点基础结构(包括SBCLsave-lisp-and-die)无法恢复除主要基础之外的任何其他线程。这说明了管理gdb - 堆栈的难度。

相关问题