我创建了一个连接到侦听服务器的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 ()
我们试图在我们的环境中重现这个问题,但我们做不到。
什么会导致核心文件?
请帮我避免这种情况。
谢谢, 纳加
答案 0 :(得分:1)
_dl_sysinfo_int80
只是一个对内核进行系统调用的函数。因此,核心转储发生在系统调用(可能是第一个示例中的connect
和第二个示例中的nanosleep
),可能是因为您传递了无效指针。
无效指针可能是因为调用这些函数的代码被破坏或者程序中的其他地方被破坏并破坏了程序的内存。
在两个示例的核心转储中查看上面的两个帧(帧#2
)并检查传递的参数。不幸的是,似乎你没有使用调试信息进行编译,因此很难看到它们。
此外,我建议您尝试valgrind
并查看是否找到了某些内容。
答案 1 :(得分:0)
你的节目几乎在以上任何一个地方都有不 coredump。
最有可能的情况是,您的进程中有多个线程(而其他一些线程导致核心转储),或者外部某些东西导致您的进程死亡(例如'kill -SIGABRT <pid>'
)。
如果你有多个线程,GDB 'info threads'
和'thread apply all where'
可能会提供更多线索。