系统相关
首页 > 系统相关> > c-识别导致内存错误的变量

c-识别导致内存错误的变量

作者:互联网

因此,我现在几次遇到一个奇怪的错误,我正在寻找一些确定问题的指导.

基本上我看到的是段错误.症状如下:

>仅在程序处于发布模式而不是调试时才会发生.
>它看起来像是段错误,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

您有几种选择:

>将代码移植到可以使用ValgrindAddressSanitizer的平台上
>使用许多调试malloc实现之一(dmalloc,mpatrol等). QNX有one.
>仔细阅读代码,确保不要将更多的数据写入可能分配的缓冲区.

标签:c,debugging,memory,gdb,segmentation-fault
来源: https://codeday.me/bug/20191013/1905551.html