GDB回溯消息“0x0000000000000000 in ??()”是什么意思?

时间:2008-09-23 14:26:59

标签: c++ gdb pthreads fastcgi freebsd

当它给出具有以下输出的回溯时是什么意思?

#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库。特别是什么? ()????

编辑:最终在我的主代码中跟踪崩溃到标准的无效内存访问。不解释为什么堆栈跟踪已损坏,但这是另一天的问题:)

5 个答案:

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

可能导致崩溃的错误已经破坏了堆栈(堆栈的覆盖部分)?在这种情况下,回溯可能是无用的;不知道该怎么做......