段错误不会在调试器中发生,也不会在 valgrind 中发生
Segfault doesn't occur in debugger neither valgrind
我正在尝试调试 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 question/answers 但直到现在都没有帮助我所以提出了这个问题。
我可以根据经验提供一些可能有帮助的一般准则。此外,幸运的是,这个答案可能对其他人有一些帮助 class 问题,而不是特定于您的代码。
如果崩溃(不在调试器下)是可重复的,那很好。开始去除代码的主要功能部分,一次一个功能。你不关心这个测试代码是否"works",只关心它是否在退出时崩溃。
如果你幸运的话,它会在这样的几次迭代后一直崩溃,然后突然,退出时不再崩溃。仔细检查您刚刚删除的代码块。
段错误通常是一个指针,它写掉了某个缓冲区的末尾,或者是某个函数将 X 字节放在堆栈上,然后稍后从堆栈中弹出 Y 字节的地方(更改时发生在我身上一次) 32 到 64 位类型的原型)。
如果你存根的第一段代码让问题消失了,那么你很不走运,但是当你把它放回去并尝试存根其他东西时,它仍然会消失。然后你正在处理程序中其他地方的一些事情,弄乱了你的记忆,并且删除与问题没有直接关联的任意代码会四处移动,使错误出现或消失。
最后一件事要检查,编译器优化标志。这真的不太可能,但在我的职业生涯中,我遇到过老实说的编译器错误。尝试在不进行任何优化的情况下进行编译,看看它是否仍然在退出时崩溃。也尝试使用最大优化进行编译。查看行为是否改变。
如果 none 有帮助,您将不得不逐行查找内存分配和空闲点并查找不匹配项。
最后的想法是,为函数内部具有局部作用域的对象分配的内存,以及通过引用返回给调用程序的内存可能是无效的,并且可能会在程序退出时尝试清理。
祝你好运。
我正在尝试调试 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 question/answers 但直到现在都没有帮助我所以提出了这个问题。
我可以根据经验提供一些可能有帮助的一般准则。此外,幸运的是,这个答案可能对其他人有一些帮助 class 问题,而不是特定于您的代码。
如果崩溃(不在调试器下)是可重复的,那很好。开始去除代码的主要功能部分,一次一个功能。你不关心这个测试代码是否"works",只关心它是否在退出时崩溃。
如果你幸运的话,它会在这样的几次迭代后一直崩溃,然后突然,退出时不再崩溃。仔细检查您刚刚删除的代码块。
段错误通常是一个指针,它写掉了某个缓冲区的末尾,或者是某个函数将 X 字节放在堆栈上,然后稍后从堆栈中弹出 Y 字节的地方(更改时发生在我身上一次) 32 到 64 位类型的原型)。
如果你存根的第一段代码让问题消失了,那么你很不走运,但是当你把它放回去并尝试存根其他东西时,它仍然会消失。然后你正在处理程序中其他地方的一些事情,弄乱了你的记忆,并且删除与问题没有直接关联的任意代码会四处移动,使错误出现或消失。
最后一件事要检查,编译器优化标志。这真的不太可能,但在我的职业生涯中,我遇到过老实说的编译器错误。尝试在不进行任何优化的情况下进行编译,看看它是否仍然在退出时崩溃。也尝试使用最大优化进行编译。查看行为是否改变。
如果 none 有帮助,您将不得不逐行查找内存分配和空闲点并查找不匹配项。
最后的想法是,为函数内部具有局部作用域的对象分配的内存,以及通过引用返回给调用程序的内存可能是无效的,并且可能会在程序退出时尝试清理。
祝你好运。