mmc*_*coo 16 linux memory-management glibc
在Linux环境中,当获取"glibc***free():无效指针"错误时,如何识别导致它的代码行?
有没有办法强迫中止?我记得有一个ENV var可以控制它吗?
如何在gdb中为glibc错误设置断点?
DGe*_*try 16
我相信如果你setenv MALLOC_CHECK_为2,glibc会abort()在检测到"free():invalid pointer"错误时调用.请注意环境变量名称中的尾随下划线.
如果MALLOC_CHECK_是1 glibc将打印"free():无效指针"(和其他错误类似的printfs).如果MALLOC_CHECK_为0,glibc将默默地忽略此类错误并返回.如果MALLOC_CHECK_是3 glibc将打印消息然后调用abort().即它是一个位掩码.
您也可以mallopt(M_CHECK_ACTION, arg)使用0-3的参数调用,并获得与之相同的结果MALLOC_CHECK_.
由于您看到"free():invalid pointer"消息,我认为您必须已经设置MALLOC_CHECK_或调用mallopt().默认情况下,glibc不会打印这些消息.
至于如何调试它,安装处理程序SIGABRT可能是最好的方法.您可以在处理程序中设置断点或故意触发核心转储.
我建议你得到valgrind:
valgrind --tool = memcheck --leak-check = full ./a.out
一般来说,看起来你可能需要重新编译 glibc,呃。
你没有说明你正在运行的环境,但如果你可以为 OS X 重新编译你的代码,那么它的 libc 版本有一个 free() 来监听这个环境变量:
MallocErrorAbort If set, causes abort(3) to be called if an
error was encountered in malloc(3) or
free(3) , such as a calling free(3) on a
pointer previously freed.
Run Code Online (Sandbox Code Playgroud)
OS X 上的 free() 手册页提供了更多信息。
如果您使用的是 Linux,那么请尝试Valgrind,它可以找到一些无法捕获的错误。
| 归档时间: |
|
| 查看次数: |
26990 次 |
| 最近记录: |