2010-11-10 88 views
0

我有一个在Solaris 8上运行的应用程序(SunOS 5.8 Generic_108528-27 sun4u sparc SUNW,Sun-Fire-880),它运行良好,直到最近崩溃。有一个看门狗模块在崩溃时重新启动应用程序。然而,它一次又一次地运行和崩溃。在检查了核心转储后,我发现它崩溃了系统函数调用,例如轮询,写入和发送。我检查了传递给函数的变量的内容,它们看起来不错。我不知道如何解决这个问题。任何人都可以帮忙给出一些关于继续的指导吗?提前致谢。C编程poll()的分割错误

下面显示的对民意调查的核心转储一个例子:

的bash $ GDB applx applx.core
GDB是自由软件,欢迎您来分发
在一定条件下它的副本;键入“显示复制”查看条件。
GDB绝对没有保证;请输入“显示保修”以了解详情。
GDB 4.16(Sun SPARC的-solaris2.5),版权1996自由软件基金会,公司...

警告:EXEC文件比核心文件新。
核心由`applx -h'生成。
程序以信号11结束,分段故障。
读取/usr/lib/libsocket.so.1...done中的符号。
读取/usr/lib/libnsl.so.1...done中的符号。
读取/usr/lib/libgen.so.1...done中的符号。
读取/usr/lib/libc.so.1...done中的符号。
读取/usr/lib/libdl.so.1...done中的符号。
读取/usr/lib/libmp.so.2...done中的符号。
读取/usr/platform/SUNW,Sun-Fire-880/lib/libc_psr.so.1...done中的符号。
#0 0xff219ec4在_libc_poll()
(GDB)BT
#0 0xff219ec4在_libc_poll()中循环
#1 0xff1cccac在_select()
#2 0x1cf08()通过/ 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在_select(
(gdb)up
#2 0x1cf08在/ home/ian123/applx/src/task的循环()中。c:1450
1450 r = select(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 =(timeval结构*)0xb81a0
(GDB)p * rfdsp
$ 6 = {fds_bits = {7610424,0}}
(GDB)P * TVP
$数据:= {tv_sec = 0,tv_usec = 380002}

+0

只是为了消除可能性,是程序多线程(在这种情况下,你可能正在看栈的wron线程)? – nos 2010-11-10 09:14:11

+0

你好,它是单线程的。谢谢 – user502865 2010-11-10 10:07:28

+1

@ user502865在这种情况下,我会开始在某处寻找缓冲区溢出/堆损坏。 – nos 2010-11-10 10:37:51

回答

0

如果GDB会显示您的源代码中发生分段错误,那么这可能很快就会导致对问题的理解。

+0

正如你可以看到与问题一起发布的gdb输出,变量内容对我来说看起来不错。 – user502865 2010-11-10 10:11:59

+0

我确实看到了,但实际的分段错误发生在libc_poll中,而不是你的函数循环的选择调用。如果你能在这里看到可以帮助很多的人。 – 2010-11-10 13:07:09

2

当我调查一个段错误,我不知道它是怎么回事,我用下面的GDB命令:

x/1i <program_counter> 

(替代<程序计数器>为您架构的...(击鼓) ...程序计数器,例如:x86上的$ eip,我想它是$ pc或SPARC上的类似)。

显示错误指示。从那里我检查包含内存地址的寄存器。