如何强制中止的“glibc的检测***免费():无效的指针”(How to force abort

2019-07-20 16:21发布

在Linux环境中,当获得“glibc的检测***免费():无效的指针”的错误,我怎么确定哪些行代码导致它?

有没有办法强制中止? 我记得有作为一个的环境变量来控制呢?

如何设置在gdb断点的glibc的错误?

Answer 1:

我相信,如果你SETENV MALLOC_CHECK_ 2,glibc就可以调用abort()当它检测到“自由():无效的指针”错误。 注意在环境变量名的结尾下划线。

如果MALLOC_CHECK_为1周的glibc将打印“免费():无效的指针”(和其他错误类似printfs输出)。 如果MALLOC_CHECK_为0,glibc就可以静静地忽略这样的错误,并简单地返回。 如果MALLOC_CHECK_是3 glibc就可以打印出消息,然后调用abort() 即它的位掩码。

您也可以拨打mallopt(M_CHECK_ACTION, arg)与0-3的说法,并得到相同的结果与MALLOC_CHECK_

因为你所看到的“自由():无效的指针”的消息,我认为你必须已经设置MALLOC_CHECK_或致电mallopt() 默认情况下,glibc不打印这些消息。

至于如何调试它,安装一个处理SIGABRT可能是进行的最好方式。 您可以在处理程序中设置断点或故意引发核心转储。



Answer 2:

我建议你的valgrind:

Valgrind的--tool = MEMCHECK --leak检查=全./a.out



Answer 3:

在一般情况下,它看起来像你可能需要重新编译glibc的,唉。

你不说你正运行在哪种环境,但如果你可以重新编译你的OS X的代码,然后它的版本的libc中有一个自由()的监听此环境变量:

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.

该手册页免费()在OS X上有更多的信息。

如果你是在Linux上,然后尝试Valgrind的 ,它可以找到一些不可能对狩猎的错误。



Answer 4:

如何设置在gdb断点?

(GDB)b文件名:行号//例如,B的main.cpp:100

有没有办法强制中止? 我记得有作为一个的环境变量来控制呢?

我是,它在默认情况下中止的印象。 请确保您有安装调试版本。

或者使用libdmalloc5:“轻松替代系统的malloc', realloc的“, calloc',自由’和其他内存管理程序同时运行时提供强大的调试工具配置这些设施包括诸如内存泄漏追踪,栅栏后。写检测,文件/行号报告,以及统计数据的一般记录。”

添加到您的链接命令

-L/usr/lib/debug/lib -ldmallocth

当glibc的触发中止gdb会自动返回控制。

或者,你可以设置一个信号处理程序SIGABRT转储堆栈跟踪到FD(文件描述符)。 下面,mp_logfile是FILE *

void *array[512 / sizeof(void *)]; // 100 is just an arbitrary number of backtraces, increase if you want.
size_t size;

size = backtrace (array, 512 / sizeof(void *));
backtrace_symbols_fd (array, size, fileno(mp_logfile));


文章来源: How to force abort on “glibc detected *** free(): invalid pointer”