【问题标题】:C Programming Segmentation fault on poll()poll() 上的 C 编程分段错误
【发布时间】: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


【解决方案1】:

当我正在调查段错误但我不知道它发生在哪里时,我使用以下 gdb 命令:

x/1i <program_counter>

(将 替换为您的体系结构的 ...(drum roll)... 程序计数器,例如:x86 上的 $eip。我猜它是 SPARC 上的 $pc 或类似的)。

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

【讨论】:

  • 对于使用 x86_64 的人,它是 $rip
【解决方案2】:

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

【讨论】:

  • 您可以看到我与问题一起发布的 gdb 输出,变量内容对我来说看起来不错。
  • 我确实看到了,但实际的分段错误发生在 libc_poll 中,而不是您的函数循环调用 select。如果您能了解这里,那将有很大帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
  • 2013-02-04
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多