如何转储线程堆栈

问题描述 投票:3回答:5

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

c linux x86
5个回答
2
投票

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

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


2
投票

使用pthread_attr_getstack函数;这会产生线程的堆栈地址和大小。


1
投票

使用gdb通过其PID(进程ID)附加到正在运行的进程:

gdb -p 1234

然后键入bt以获得回溯。


1
投票

Glibc具有称为回溯的功能,可以满足您的需求。

http://www.delorie.com/gnu/docs/glibc/libc_665.html

http://www.linuxjournal.com/article/6391?page=0,0

上次我尝试过,结果并不完美,但有些有用。因人而异。


1
投票

为什么要转储线程的堆栈?

你想要一些application checkpointing吗?如果你想要它,有一些库实现它,甚至不完美,但在实践中很有用。

关键是,即使您设法将线程的堆栈转储到文件中,我也不确定您是否能够对该文件进行有用的处理。您甚至无法使用这些堆栈重新启动应用程序,因为重新启动时(即使在相同的配置中)堆栈可能位于其他位置(因为ASLR),除非您在/proc/sys/kernel/randomize_va_space中写入0位数

我听说还有一些linux库强制正在运行的进程转储核心文件(稍后可以用gdb检查),而不会中止该进程。

调用堆栈非常脆弱,如果不采取预防措施,则无法重新使用它。

如果你只想检查你的调用堆栈,请查看Ian Taylor的libbacktrace

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

© www.soinside.com 2019 - 2024. All rights reserved.