在这种情况下,C++ Qt GUI 程序崩溃,堆栈没有明确的参考崩溃的来源,如何做或如何调试的任何提示。
QtCreator 是否有一些设置或其他一些工具可以分析崩溃的起始点?我假设它发生在主线程之外,导致它不显示,但这只是一个猜测。
1 __GI_raise raise.c 51 0x7ffff2ddae87
2 __GI_abort abort.c 79 0x7ffff2ddc7f1
3 ?? 0x7ffff37cf957
4 ?? 0x7ffff37d5ae6
5 std::terminate() 0x7ffff37d5b21
6 qTerminate() 0x7ffff3d73205
7 QThreadPrivate::start(void *) 0x7ffff3d93be7
8 start_thread pthread_create.c 463 0x7ffff3ad36db
9 clone clone.S 95 0x7ffff2ebd61f
堆栈跟踪中没有任何自己的代码,所有代码都是反汇编形式。
我希望 stacktrace 有指向崩溃开始的我自己的代码的起点,但只有库和系统代码。
感谢@AlanBirtles,我还找到了错误的应用程序输出,这可能会进一步帮助我。
Qt has caught an exception thrown from an event handler. Throwing
exceptions from an event handler is not supported in Qt.
You must not let any exception whatsoever propagate through Qt code.
If that is not possible, in Qt 5 you must at least reimplement
QCoreApplication::notify() and catch all exceptions there.
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
谢谢你。
该工具称为调试器,QtCreator 中有一个。一般来说,您可以从触发崩溃的操作开始,然后您可以逐步跟踪代码执行,直到崩溃发生,以便您知道哪一行是最后执行的。请注意,它可能不是导致崩溃的行,特别是当它是指针问题时。但是,最后一行可能是正在使用指针执行某些操作的行。如果您确定了它是哪个指针,您现在可以在整个程序中跟踪它的使用情况。
更简单的方法是开始调试,当崩溃发生时它应该停止并为您提供完整的跟踪。但事实可能并非如此。如果您使用多线程,还要查找竞争条件。
使用原始指针通常不是一个好主意。