我正在尝试调试C ++ Qt5程序,但我无法使用,大多数情况下它会在退出时崩溃(从shell启动时)。
当它从valgrind或gdb / lldb启动时,它不会崩溃。
我已经尝试过生成一个coredump然后加载,但结果很无奈,bt
只有一帧。
实际代码托管在github。
Valgrind输出:
$ valgrind --tool=memcheck ./build/qsubber
==27761== Memcheck, a memory error detector
==27761== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==27761== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==27761== Command: ./build/qsubber
==27761==
==27761== Conditional jump or move depends on uninitialised value(s)
==27761== at 0x15D790FA: ??? (in /usr/lib/libgtk-x11-2.0.so.0.2400.28)
==27761== by 0x9733523: ??? (in /usr/lib/libgobject-2.0.so.0.4400.1)
==27761== by 0x974CF96: g_signal_emit_valist (in /usr/lib/libgobject-2.0.so.0.4400.1)
==27761== by 0x974DE39: g_signal_emit_by_name (in /usr/lib/libgobject-2.0.so.0.4400.1)
==27761== by 0x973AC2A: g_object_set_valist (in /usr/lib/libgobject-2.0.so.0.4400.1)
==27761== by 0x973B4BB: g_object_set (in /usr/lib/libgobject-2.0.so.0.4400.1)
==27761== by 0x636ECC5: ??? (in /usr/lib/libQt5Widgets.so.5.5.0)
==27761== by 0x62F264C: QStyleFactory::create(QString const&) (in /usr/lib/libQt5Widgets.so.5.5.0)
==27761== by 0x628B704: QApplication::style() (in /usr/lib/libQt5Widgets.so.5.5.0)
==27761== by 0x628BACC: QApplicationPrivate::initialize() (in /usr/lib/libQt5Widgets.so.5.5.0)
==27761== by 0x628BB1E: QApplicationPrivate::construct() (in /usr/lib/libQt5Widgets.so.5.5.0)
==27761== by 0x413DFC: main (main.cc:34)
==27761==
Token: bp5tqvuocvv993496ppnds1j91
Status: 200 OK
==27761==
==27761== HEAP SUMMARY:
==27761== in use at exit: 6,490,962 bytes in 30,293 blocks
==27761== total heap usage: 167,918 allocs, 137,625 frees, 19,981,839 bytes allocated
==27761==
==27761== LEAK SUMMARY:
==27761== definitely lost: 5,152 bytes in 32 blocks
==27761== indirectly lost: 21,255 bytes in 779 blocks
==27761== possibly lost: 3,977,133 bytes in 7,134 blocks
==27761== still reachable: 2,305,790 bytes in 21,486 blocks
==27761== suppressed: 0 bytes in 0 blocks
==27761== Rerun with --leak-check=full to see details of leaked memory
==27761==
==27761== For counts of detected and suppressed errors, rerun with: -v
==27761== Use --track-origins=yes to see where uninitialised values come from
==27761== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
更新 我没有要求为我调试此代码,在这种情况下我需要帮助调试,我已经搜索了很多并找到了一些SO问题/答案但是直到现在才创建这个问题没有任何帮助。< / p>
答案 0 :(得分:3)
我可以根据经验提供一些可能有用的一般指导原则。另外,幸运的是,这个答案可能对其他有这类问题的人有所帮助,而不是特定于你的代码。
如果崩溃(不在调试器下)是可重复的,那很好。开始删除代码的主要功能部分,一次一个功能。你不在乎这个测试代码&#34;是否正常工作&#34;是否在退出时崩溃。
如果你很幸运,它会在经过几次迭代后继续崩溃,然后突然,不再在退出时崩溃。检查你刚刚删除的代码块。
段错误通常是指向某个缓冲区末尾的指针,或者是某个函数将X字节放在堆栈上的位置,然后稍后从堆栈中弹出Y字节(在我更改原型时发生过一次) 32到64位类型。)
如果您存在的第一段代码会导致问题消失,那么您运气不好,但是当您将其放回原处并尝试将其他内容删除时,它仍然会消失。然后你正在处理程序中其他地方的东西弄乱你的记忆,并且删除与问题没有直接关联的任意代码会移动事物以使bug出现或消失。
要检查的最后一件事是编译器优化标志。这真的不太可能,但是在我的职业生涯中,我对诚实编译错误表示诚实。尝试编译时根本没有优化,看看它在退出时是否仍然崩溃。尝试使用最大优化进行编译。查看行为是否发生变化。
如果这些都没有帮助,那么你将不得不逐行寻找内存分配和空闲点并寻找不匹配。
最后的想法,为函数内部具有局部作用域的对象分配的内存,以及通过引用返回到调用程序可能无效,并且可能在程序退出时尝试清理。
祝你好运。