如何强制中止"glibc detect***free():无效指针"

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可能是最好的方法.您可以在处理程序中设置断点或故意触发核心转储.


dic*_*oce 7

我建议你得到valgrind:

valgrind --tool = memcheck --leak-check = full ./a.out

  • 您将有多次运行,因此请根据当前时间获取valgrind输出到文件名.valgrind - tool = memcheck --leak-check = full --log-file =`date +%s`-vg.txt ./a.out (2认同)

Adr*_*ian 3

一般来说,看起来你可能需要重新编译 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,它可以找到一些无法捕获的错误。