2016-12-30 51 views
1

有时一个Linux守护进程守护程序我用C写获取这些错误消息:调试用C语言编写

[Fri Dec 30 07:58:54 2016] listend[13944]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000] 

[Fri Dec 30 07:58:54 2016] listend[13948]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000] 

[Fri Dec 30 07:58:54 2016] listend[13949]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000] 

[Fri Dec 30 07:58:54 2016] listend[13950]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000] 

[Fri Dec 30 07:58:54 2016] listend[13951]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000] 

[Fri Dec 30 07:58:54 2016] listend[13952]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000] 

[Fri Dec 30 07:58:54 2016] listend[13953]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000] 

[Fri Dec 30 07:58:54 2016] listend[13954]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000] 

[Fri Dec 30 07:58:54 2016] listend[13955]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000] 

我的问题是我怎么能检查libc-2.19.so该地址,看看哪些功能在错误发生时被调用?我试着用gdb

,但我得到:

$ gdb code/listen/i686-Linux/listend 
. 
. 
(gdb) info addr 0xb7575000 
No symbol "0xb7575000" in current context. 
(gdb) info addr 0xb771c000 
No symbol "0xb771c000" in current context. 
+4

在['valgrind'](http://valgrind.org)下运行你的守护进程。这个bug几乎肯定不在libc中; valgrind会在您的code_中显示触发_first_无效内存访问的点。这可能不是问题的根源,但它通常比现在更接近根本原因。 – zwol

+0

对,我想如果我能找到libc中哪个函数指向的地址,我可以将其追溯到我的代码中。我知道100%我的代码有错误,而不是libc ;-) –

+3

它也有助于编译你的代码而无需优化,并使用调试符号:'gcc -O0 -g ...'。这将改善gdb和valgrind的输出。 –

回答

1

与您提供有可以在这里完成,使您的问题诊断非常小的数据。我可以推断出地址是0,指向代码中的NULL取消引用(您将NULL作为指向字符串地址的指针或类似的东西,从而使得printf()调用失败---或类似的情况再次发生)地址0x1a7000是在libc中引发异常的地方。您可能可以通过对您的libc.so.xx.xx.xx执行nm(1)来猜测函数名称。转储核心(通过在执行守护进程之前设置ulimit -c unlimited)将允许使用postmortem调试器。或者守护进程的源代码也可能有帮助。对不起,但你的问题远远不能完成,以帮助。有关更多信息,请参见How to create a Minimal, Complete, and Verifiable example

+0

这就是我正在寻找的答案:您可能可以通过对您的libc.so.xx.xx.xx执行nm(1)来猜测函数名称。谢谢! –

+0

如果这是您正在寻找的答案,请将它标记为这样! :))你会得到一个真正的答案与验尸核心图像和gdb调试器也。 –

+0

它间歇性地抛出了这个错误,我一直在监视几天,有时几个星期试图抓住它。 –