当它给出具有以下输出的回溯时是什么意思?
#0 0x00000008009c991c in pthread_testcancel () from /lib/libpthread.so.2
#1 0x00000008009b8120 in sigaction () from /lib/libpthread.so.2
#2 0x00000008009c211a in pthread_mutexattr_init () from /lib/libpthread.so.2
#3 0x0000000000000000 in ?? ()
该程序已经崩溃,标准信号11,分段故障。 我的应用程序是一个在FreeBSD 6.3上运行的多线程FastCGI C ++程序,使用pthread作为线程库。
根据信息来源,它已使用-g编译,并且我的源码的所有符号表都已加载。
很明显,我的实际代码都没有出现在跟踪中,而是错误似乎来自标准的pthread库。特别是什么? ()????
编辑:最终在我的主代码中跟踪崩溃到标准的无效内存访问。不解释为什么堆栈跟踪已损坏,但这是另一天的问题:)
答案 0 :(得分:9)
gdb无法从pthread_mutexattr_init中提取正确的返回地址;它的地址为0.“??”是在符号表中查找地址0的结果。它找不到符号名称,因此它会打印默认的“??”
不幸的是,我不知道为什么它无法提取正确的返回地址。
答案 1 :(得分:6)
你做的事情导致线程库崩溃。由于线程库本身未使用调试符号(-g)进行编译,因此无法显示发生崩溃的源代码文件或行号。此外,由于它是线程,因此调用堆栈不会指向您的文件。不幸的是,这将是一个难以追踪的错误,你需要逐步完成代码并尝试缩小发生崩溃的时间。
答案 2 :(得分:3)
确保使用调试符号进行编译。 (对于gcc,我认为这是-g选项)。然后你应该能够从GDB中获得更多有趣的信息。编译生产版本时不要忘记将其关闭。
答案 3 :(得分:2)
我可能会遗漏某些内容,但这不是指示有人使用NULL
作为函数指针吗?
#include <stdio.h>
typedef int (*funcptr)(void);
int
func_caller(funcptr f)
{
return (*f)();
}
int
main()
{
return func_caller(NULL);
}
如果你在gdb中运行它,它会产生相同类型的回溯:
rivendell$ gcc -g -O0 foo.c -o foo
rivendell$ gdb --quiet foo
Reading symbols for shared libraries .. done
(gdb) r
Starting program: ...
Reading symbols for shared libraries . done
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x00000000
0x00000000 in ?? ()
(gdb) bt
#0 0x00000000 in ?? ()
#1 0x00001f9d in func_caller (f=0) at foo.c:8
#2 0x00001fb1 in main () at foo.c:14
虽然这是一个非常奇怪的崩溃...... pthread_mutexattr_init
很少做除了分配数据结构和memset
之外的任何事情。我会寻找其他的东西。是否存在不匹配的线程库或其他内容的可能性。我的BSD知识有点陈旧,但过去常常出现问题。
答案 4 :(得分:0)
可能导致崩溃的错误已经破坏了堆栈(堆栈的覆盖部分)?在这种情况下,回溯可能是无用的;不知道该怎么做......