4

我目前正在将我们的代码从 alpha (Tru64) 移植到 C 中的 i386 处理器 (Linux)。在我考虑移植我们的异常处理例程之前,一切都进行得很顺利。目前,我们有一个父进程,它产生许多子进程,当这些子进程之一是致命的(未字段)时,我有例程来捕获该进程。

我目前正在努力寻找实现回溯例程的最佳方法,该例程可以列出错误日志中的函数地址,目前我的例程只打印导致异常的信号和异常限定符代码。

任何帮助都会得到很大的帮助,理想情况下我会为所有处理器编写错误处理,但是在这个阶段我只关心 i386 和 x86_64。

谢谢

标记

4

6 回答 6

2

glibc 函数backtrace()backtrace_symbols(), fromexecinfo.h可能有用。

于 2010-03-08T12:04:12.823 回答
2

您可以查看http://tlug.up.ac.za/wiki/index.php/Obtaining_a_stack_trace_in_C_upon_SIGSEGV。它涵盖了您需要的功能。但是,您必须链接 libgdb 和 libdl,使用 -rdynamic 编译(在可执行文件中包含更多符号),并放弃使用一些优化。

于 2010-03-08T10:28:42.100 回答
1

有两个 GNU(非 POSIX)函数可以帮助您 -backtrace()并且backtrace_symbols()- 首先返回函数地址数组,然后将地址解析为名称。不幸的是,静态函数的名称无法解析。

为了让它工作,你需要用-rdynamic标志编译你的二进制文件。

于 2010-03-08T12:00:07.690 回答
0

不幸的是,没有“最佳”方法,因为堆栈的布局可能因 CPU、操作系统和用于编译代码的编译器而异。但这篇文章可能会有所帮助

请注意,您必须在子进程中实现这一点;父进程只是得到一个错误的信号;你没有得到子堆栈的副本。

于 2010-03-08T10:00:37.957 回答
0

如果有评论,您声明您正在使用 gcc。这个http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Return-Address.html#Return-Address可能有用。

于 2010-03-08T10:28:04.487 回答
0

如果您在通过 valgrind 运行时只获得适当的回溯没问题,那么这可能是您的一个选择:

VALGRIND_PRINTF_BACKTRACE(格式,...):

它将为您提供所有功能的回溯,包括静态功能。

于 2011-07-09T12:54:03.240 回答