我的C ++代码中有一个非常奇怪的错误。
我必须告诉你要了解整体的故事。 我通过boost_thread库使用线程。 主要方法进行一些初始化,启动3-4个线程,然后永远等待:
while(true) sleep(1);
所有线程的主要函数都尝试使用一些catch和catch all handler:
void do_work() {
try {
..
}
catch (int ei) {
}
catch (...) {
log("General error");
}
}
线程执行各种任务,如
有些时候,通常不会,但经常会让程序被终止烦恼。
所有内容都应该被正确释放并删除,因此这不是问题所在。 我做了它来生成核心转储,以便有机会调试问题。
有趣的部分现在来到这里: 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频道上搜索,以及谷歌搜索它 - 但仍然没有。 我几周前就被困住了,所以非常感谢任何信息!
非常感谢!
答案 0 :(得分:1)
SIGABRT通常在事情变得非常糟糕时发送。它们很难追踪,因为堆栈可能会被破坏。
从回溯中看起来,您正在使用已剥离(可能已优化)的可执行文件运行。您是否尝试过编译和链接-g
,这样当您获得coredump时,您可以获得更多洞察力?