【发布时间】:2011-05-07 17:39:30
【问题描述】:
我有一个在 Solaris 8 (SunOS 5.8 Generic_108528-27 sun4u sparc SUNW,Sun-Fire-880) 上运行的应用程序,它运行了好几天,直到最近它崩溃了。有一个看门狗模块在应用程序崩溃时重新启动它。但是,它一次又一次地运行并崩溃。在检查了核心转储后,我发现它在轮询、写入和发送等系统函数调用上崩溃了。我检查了传递给函数的变量的内容,它们看起来不错。我不知道如何解决这个问题。任何人都可以帮助提供一些关于在哪里进行的指导?提前致谢。
下面显示了 poll 上的核心转储示例之一:
bash$ gdb applx applx.core
GDB 是免费软件,欢迎您分发它的副本
在某些条件下;键入“显示复制”以查看条件。
GDB 绝对没有任何保证;输入“显示保修”以了解详细信息。
GDB 4.16 (sparc-sun-solaris2.5),版权所有 1996 Free Software Foundation, Inc...
警告:执行文件比核心文件更新。
核心是由 `applx -h' 生成的。
程序以信号 11 终止,分段错误。
从 /usr/lib/libsocket.so.1 读取符号...完成。
从 /usr/lib/libnsl.so.1 读取符号...完成。
从 /usr/lib/libgen.so.1 读取符号...完成。
从 /usr/lib/libc.so.1 读取符号...完成。
从 /usr/lib/libdl.so.1 读取符号...完成。
从 /usr/lib/libmp.so.2 读取符号...完成。
从 /usr/platform/SUNW、Sun-Fire-880/lib/libc_psr.so.1...读取符号...完成。
#0 0xff219ec4 in _libc_poll()
(gdb) BT
#0 0xff219ec4 in _libc_poll()
#1 0xff1cccac in _select()
#2 0x1cf08 in loop () at /home/ian123/applx/src/task.c:1450
#3 0x1e0d4 in state_start (local=0) at /home/ian123/applx/src/state.c:1047
#4 0x1a0f4 in main (argc=537600, argv=0x83400)
在 /home/ian123/applx/src/main.c:578
(gdb) 向上
#1 0xff1cccac in _select()
(gdb) 向上
#2 0x1cf08 in loop () at /home/ian123/applx/src/task.c:1450
1450 r = 选择(maxfd,rfdsp,wfdsp,efdsp,tvp);
(gdb) p maxfd
$1 = 23
(gdb) p rfdsp
$2 = (fd_set *) 0xb8020
(gdb) p wfdsp
$3 = (fd_set *) 0x0
(gdb) p efdsp
$4 = (fd_set *) 0x0
(gdb) p tvp
$5 = (struct timeval *) 0xb81a0
(gdb) p *rfdsp
$6 = {fds_bits = {7610424, 0 }}
(gdb) p *tvp
$7 = {tv_sec = 0, tv_usec = 380002}
【问题讨论】:
-
只是为了消除可能性,程序是否是多线程的(在这种情况下,您可能正在查看堆栈中的错误线程)?
-
您好,它是单线程的。谢谢
-
@user502865 在这种情况下,我会开始在某处搜索缓冲区溢出/堆损坏。
标签: c segmentation-fault