因此,我现在几次遇到一个奇怪的错误,我正在寻找一些确定问题的指导.
基本上我看到的是段错误.症状如下:
>仅在程序处于发布模式而不是调试时才会发生.
>它看起来像是段错误,GDB告诉我它在函数末尾位于_list_release / _free()/ free()中.
程序收到信号SIGSEGV,分段故障.
来自/usr/qnx650/target/qnx6/x86/lib/libc.so.3的_list_release()中的0xb0328af8
(gdb)bt
来自/usr/qnx650/target/qnx6/x86/lib/libc.so.3的_list_release()中的0 0xb0328af8
来自/usr/qnx650/target/qnx6/x86/lib/libc.so.3的__free()中的1 0xb032a464
来自/usr/qnx650/target/qnx6/x86/lib/libc.so.3的free()中的2 0xb0329f7d
>我没有使用任何动态内存(除了在Eigen(或其他库)中可能出现的内容之外)
>我可以在函数结束之前打印所有局部变量,因此它不是double free.
上一次发生这种情况是因为内存故障可以解决所有这些问题.恼人的是这次我找不到问题了.
我想做的是以下几点:
>这将特别有用:我如何在Debug模式下强制该错误,然后GDB会更有帮助.
>找出导致问题的小bug的最佳方法是什么.注意:我不能使用valgrind,它不能在我正在使用的操作系统(QNX)上运行
任何帮助都会很棒.
解决方法:
It appears as a segfault and GDB tells me that it is in _list_release/_free()/free()
通常,free()中的任何崩溃都是堆损坏的迹象(两次释放,写入已释放的内存,释放未分配的(例如堆栈或全局)内存或堆缓冲区溢出).
I am not using any dynamic memory
是的,你是.您通过其他库间接执行此操作的事实是无关紧要的.
I can print all local variables just before the end of the function, so its not a double free.
正如许多评论者已经说过的那样,您的结论并不成立:您可以很好地访问freed的内存,甚至还可以包含有意义的值.
How can I force this error in Debug mode, then GDB would be way more helpful.
>您可以使用“ -O2 -g”(“发布”模式但启用了调试信息)进行构建.
> GDB可能没有更多帮助-GDB在调试堆损坏方面有些用处.
What is the best way to track down what little bugger
您有几种选择:
>将代码移植到可以使用Valgrind或AddressSanitizer的平台上
>使用许多调试malloc实现之一(dmalloc,mpatrol等). QNX有one.
>仔细阅读代码,确保不要将更多的数据写入可能分配的缓冲区.