linux – 如何强制中止“glibc detect *** free():无效指针”

提问

Linux环境中,当获取“glibc *** free():无效指针”错误时,如何识别导致它的代码行?

有没有办法强迫中止?我记得有一个ENV var可以控制它吗?

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

最佳答案

我相信如果你将MALLOC_CHECK_设置为2,glibc会在检测到“free():invalid pointer”错误时调用abort().请注意环境变量名称中的尾随下划线.

如果MALLOC_CHECK_为1,则glibc将打印“free():无效指针”(和其他错误类似的printfs).如果MALLOC_CHECK_为0,glibc将默默忽略此类错误并返回.如果MALLOC_CHECK_为3,则glibc将打印该消息,然后调用abort().即它是一个位掩码.

您还可以使用0-3的参数调用mallopt(M_CHECK_ACTION,arg),并获得与MALLOC_CHECK_相同的结果.

由于您看到“free():invalid pointer”消息,我认为您必须已经设置了MALLOC_CHECK_或调用mallopt().默认情况下,glibc不会打印这些消息.

至于如何调试它,为SIGABRT安装处理程序可能是最好的方法.您可以在处理程序中设置断点或故意触发核心转储.