1

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

我必须告诉你这个故事才能理解整个故事。我正在通过 boost_thread 库使用线程。main 方法进行一些初始化,启动 3-4 个线程,然后永远等待:

while(true) sleep(1);

所有线程的主要功能都有一些 catch 和 catch all 处理程序的尝试:

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 频道和谷歌上搜索它 - 但仍然没有。几周前我被困住了,所以非常感谢任何信息!

非常感谢!

4

1 回答 1

1

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

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

于 2012-06-09T22:34:13.393 回答