1

我创建了一个连接到侦听服务器的 TCP 客户端。我们也实现了 TCP keep alive。有时客户端崩溃和核心转储。以下是核心转储跟踪。

问题出在 linux 内核版本 Update 4,内核 2.6.9-42.0.10 中。

我们有两个核心转储。

(gdb) where
#0 0x005e77a2 in _dl_sysinfo_int80 () from /ddisk/d303/dumps/mhx239131/ld-
linux.so.2
#1 0x006c8bd1 in connect () from /ddisk/d303/dumps/mhx239131/libc.so.6
#2 0x08057863 in connect_to_host ()
#3 0x08052f38 in open_ldap_connection ()
#4 0x0805690a in new_connection ()
#5 0x08052cc9 in ldap_open ()
#6 0x080522cf in checkHosts ()
#7 0x08049b36 in pollLDEs ()
#8 0x0804d1cd in doOnChange ()
#9 0x0804a642 in main ()

(gdb) where
#0 0x005e77a2 in _dl_sysinfo_int80 () from /ddisk/d303/dumps/mhx239131/ld-
linux.so.2
#1 0x0068ab60 in __nanosleep_nocancel ( 
from /ddisk/d303/dumps/mhx239131/libc.so.6
#2 0x080520a2 in Sleep ()
#3 0x08049ac1 in pollLDEs ()
#4 0x0804d1cd in doOnChange ()
#5 0x0804a642 in main ()

我们试图在我们的环境中重现该问题,但我们不能。

什么会导致核心文件?

请帮助我避免这种情况。

谢谢,纳迦

4

2 回答 2

1

_dl_sysinfo_int80只是一个对内核进行系统调用的函数。所以核心转储发生在系统调用上(可能是connect第一个示例和nanosleep第二个示例中使用的那个),可能是因为您传递了无效指针。

无效的指针可能是因为调用这些函数的代码被破坏或因为程序中的其他地方被破坏并破坏了程序的内存。

查看两个示例的核心转储中的上述两帧 (frame #2),并检查正在传递的参数。不幸的是,您似乎没有使用调试信息进行编译,因此更难看到它们。

此外,我建议尝试valgrind看看它是否找到了一些东西。

于 2008-12-03T16:26:45.927 回答
0

您的程序几乎肯定没有上述任何一个地方进行核心转储。

最有可能的是,您的进程中有多个线程(以及其他一些线程导致核心转储),或者外部因素导致您的进程死亡(例如'kill -SIGABRT <pid>')。

如果确实有多个线程,GDB'info threads''thread apply all where'可能会提供进一步的线索。

于 2008-12-06T07:22:16.443 回答