2015-12-04 42 views
0

我正在看一个崩溃的程序,导致无用的(或似乎是)核心转储。我没有编写程序,但我试图找出可能的原因。QThread转储核心

第一个奇怪的是,核心转储是在QThread之后命名的,而不是我的可执行文件本身。

然后回溯内,没有暗示在节目本身的行号:

$ gdb acqui ../../appli/core.QThread.31667.1448795278 
[Thread debugging using libthread_db enabled] 
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". 
Core was generated by `./acqui'. 
Program terminated with signal SIGABRT, Aborted. 
#0 0x00007fcf4a1ce107 in __GI_raise ([email protected]=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 
56  ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory. 
(gdb) bt 
#0 0x00007fcf4a1ce107 in __GI_raise ([email protected]=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 
#1 0x00007fcf4a1cf4e8 in __GI_abort() at abort.c:89 
#2 0x00007fcf4aab9b3d in __gnu_cxx::__verbose_terminate_handler()() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#3 0x00007fcf4aab7bb6 in ??() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#4 0x00007fcf4aab7c01 in std::terminate()() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#5 0x00007fcf4aab7e69 in __cxa_rethrow() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#6 0x00007fcf4b8707db in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>)() from /usr/lib/x86_64-linux-gnu/libQtCore.so.4 
#7 0x00007fcf4b764e99 in QThread::exec()() from /usr/lib/x86_64-linux-gnu/libQtCore.so.4 
#8 0x00007fcf4b76770f in ??() from /usr/lib/x86_64-linux-gnu/libQtCore.so.4 
#9 0x00007fcf4ad6c0a4 in start_thread (arg=0x7fcf0b7fe700) at pthread_create.c:309 
#10 0x00007fcf4a27f04d in clone() at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111 
(gdb) info threads 
    Id Target Id   Frame 
    16 Thread 0x7fcf297fa700 (LWP 31676) 0x00007fcf4a27650d in poll() at ../sysdeps/unix/syscall-template.S:81 
    15 Thread 0x7fcf28ff9700 (LWP 60474) syscall() at ../sysdeps/unix/sysv/linux/x86_64/syscall.S:38 
    14 Thread 0x7fcf08ff9700 (LWP 60516) syscall() at ../sysdeps/unix/sysv/linux/x86_64/syscall.S:38 
    13 Thread 0x7fcf0bfff700 (LWP 60513) syscall() at ../sysdeps/unix/sysv/linux/x86_64/syscall.S:38 
    12 Thread 0x7fcf3932c700 (LWP 60494) syscall() at ../sysdeps/unix/sysv/linux/x86_64/syscall.S:38 
    11 Thread 0x7fcf29ffb700 (LWP 60444) syscall() at ../sysdeps/unix/sysv/linux/x86_64/syscall.S:38 
    10 Thread 0x7fcf39b2d700 (LWP 31668) 0x00007fcf4a27650d in poll() at ../sysdeps/unix/syscall-template.S:81 
    9 Thread 0x7fcf2affd700 (LWP 31673) 0x00007fcf4a27650d in poll() at ../sysdeps/unix/syscall-template.S:81 
    8 Thread 0x7fcf2bfff700 (LWP 31671) 0x00007fcf4a27650d in poll() at ../sysdeps/unix/syscall-template.S:81 
    7 Thread 0x7fcf38b2b700 (LWP 60432) syscall() at ../sysdeps/unix/sysv/linux/x86_64/syscall.S:38 
    6 Thread 0x7fcf2a7fc700 (LWP 31674) 0x00007fcf4a27650d in poll() at ../sysdeps/unix/syscall-template.S:81 
    5 Thread 0x7fcf4d4f9780 (LWP 31667) 0x00007fcf4a27650d in poll() at ../sysdeps/unix/syscall-template.S:81 
    4 Thread 0x7fcf097fa700 (LWP 60430) [email protected]@GLIBC_2.3.2() 
    at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:238 
    3 Thread 0x7fcf09ffb700 (LWP 31682) 0x00007fcf4a27650d in poll() at ../sysdeps/unix/syscall-template.S:81 
    2 Thread 0x7fcf0affd700 (LWP 31680) 0x00007fcf4a27650d in poll() at ../sysdeps/unix/syscall-template.S:81 
* 1 Thread 0x7fcf0b7fe700 (LWP 31679) 0x00007fcf4a1ce107 in __GI_raise ([email protected]=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 

我在茫然,从哪里开始。这是使用QThread的问题吗?还有别的吗?我怎样才能启用更多(或更好的)调试信息?程序本身是用-g -ggdb编译的。

+0

它是客户端代码。程序有一个运行事件回调的线程,看起来在线程中执行的一个插槽导致了一个不可恢复的错误(SIGABRT)。如果我有代码,我会寻找调用'moveToThread'的对象,我会检查它标记为插槽的方法。 – UmNyobe

+0

'catch throw'(抛出异常时中断)可能对你有帮助。 –

回答

0

这一部分:

#4 0x00007fcf4aab7c01 in std::terminate()() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#5 0x00007fcf4aab7e69 in __cxa_rethrow() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 

...意味着有问题的代码重新抛出异常,但它也不例外处理程序。所以,运行时调用std::terminate

这是一个编程错误,但究竟该怎么做取决于你的库和程序 - 也许不会再扔,也许安装一个最外面的异常处理程序和日志信息等