【发布时间】:2012-12-20 21:02:00
【问题描述】:
所以我现在遇到了几次奇怪的错误,我正在寻找一些好的方向来识别问题。
基本上我看到的是一个段错误。症状如下:
- 仅当程序处于发布模式时才会发生,而不是处于调试模式。
-
它显示为段错误,GDB 告诉我它在函数末尾的
_list_release/_free()/free()中。Program received signal SIGSEGV, Segmentation fault.0xb0328af8 in _list_release () from /usr/qnx650/target/qnx6/x86/lib/libc.so.3(gdb) bt0 0xb0328af8 in _list_release () from /usr/qnx650/target/qnx6/x86/lib/libc.so.31 0xb032a464 in __free () from /usr/qnx650/target/qnx6/x86/lib/libc.so.32 0xb0329f7d in free () from /usr/qnx650/target/qnx6/x86/lib/libc.so.3 我没有使用任何动态内存(Eigen(或其他库)中可能出现的内存除外
- 我可以在函数结束之前打印所有局部变量,所以它不是双重释放。
上次发生这种情况是内存故障,适合所有这些问题。恼人的是,这次我找不到问题所在。
我想做的是:
- 这将非常有用:如何在调试模式下强制出现此错误,然后 GDB 会更有帮助。
- 找出导致问题的小虫子的最佳方法是什么。 注意:我不能使用 valgrind,它在我使用的操作系统 (QNX) 上不起作用
任何帮助都会很棒。
【问题讨论】:
-
I can print all local variables just before the end of the function, so its not a double free.双重释放是未定义的行为,因此不一定正确。 -
@chris 好的,我该如何测试呢?
-
嗯,避免这些问题的最佳方法是立即使用 RAII 等来防止许多常见的段错误原因。总有 Clang 的 catch-undefined-behaviour 事情,这可能会有所帮助。
-
您能否在功能更强大的平台上运行您的应用程序以进行测试?
-
继续 chris 所说的 - 考虑一下:您使用一个向量,用数据填充它,然后释放其内部存储空间。内存仍在进程中,因此尝试读取它会成功,直到有人使用它,您甚至可以正确列出向量的内容。但是尝试释放向量(例如,离开其范围)将导致 AV。
标签: c++ debugging memory gdb segmentation-fault