C ++不需要的中止原因?

时间:2012-06-09 22:09:14

标签: c++ gdb glibc abort backtrace

我的C ++代码中有一个非常奇怪的错误。

我必须告诉你要了解整体的故事。 我通过boost_thread库使用线程。 主要方法进行一些初始化,启动3-4个线程,然后永远等待:

while(true) sleep(1);

所有线程的主要函数都尝试使用一些catch和catch all handler:

void do_work() {
  try {
    ..
  }
  catch (int ei) {
  }
  catch (...) {
    log("General error");
  }
}

线程执行各种任务,如

  • 使用execv函数执行脚本,
  • 使用sqlite库写入数据库,
  • 通过openssl库与世界沟通。

有些时候,通常不会,但经常会让程序被终止烦恼。

所有内容都应该被正确释放并删除,因此这不是问题所在。 我做了它来生成核心转储,以便有机会调试问题。

有趣的部分现在来到这里: GDB的回溯看起来像这样:

(gdb) bt
#0  0x40281ae8 in raise () from /lib/libc.so.6
#1  0x402830ec in abort () from /lib/libc.so.6
#2  0x402830ec in abort () from /lib/libc.so.6
#3  0x402830ec in abort () from /lib/libc.so.6
#4  0x402830ec in abort () from /lib/libc.so.6
#5  0x402830ec in abort () from /lib/libc.so.6
#6  0x402830ec in abort () from /lib/libc.so.6
#7  0x402830ec in abort () from /lib/libc.so.6
#8  0x402830ec in abort () from /lib/libc.so.6
#9  0x402830ec in abort () from /lib/libc.so.6

无休止的中止呼叫,我不知道是什么导致它。 线程看起来像这样:

(gdb) info threads
  4 Thread 490  0x402e7bf4 in nanosleep () from /lib/libc.so.6
  3 Thread 489  0x4031b384 in accept () from /lib/libc.so.6
  2 Thread 501  0x402e7bf4 in nanosleep () from /lib/libc.so.6
* 1 Thread 486  0x40281ae8 in raise () from /lib/libc.so.6

这也很有趣,因为线程1是具有无限睡眠循环的主要功能。

我的问题: 我怎样才能找出堕胎的原因(因为我不能忽视它,如果我没有记错的话)?

在论坛,IRC频道上搜索,以及谷歌搜索它 - 但仍然没有。 我几周前就被困住了,所以非常感谢任何信息!

非常感谢!

1 个答案:

答案 0 :(得分:1)

SIGABRT通常在事情变得非常糟糕时发送。它们很难追踪,因为堆栈可能会被破坏。

从回溯中看起来,您正在使用已剥离(可能已优化)的可执行文件运行。您是否尝试过编译和链接-g,这样当您获得coredump时,您可以获得更多洞察力?