在Linux环境中,当获取"glibc***free():无效指针"错误时,如何识别导致它的代码行?
有没有办法强迫中止?我记得有一个ENV var可以控制它吗?
如何在gdb中为glibc错误设置断点?
我相信如果你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