glibc detected *** double free or corruption (out): 0x0000000000515d20
#[reporter]debugin@playmp3_by_list!
#[reporter]reporter_event_pth ##cmd_data.my_msg_type=1!
#[reporter]RUN_INFO: START station 6
*** glibc detected *** double free or corruption (out): 0x0000000000515d20 ***
#[reporter]SignalHander(signal:6)(pid:19025)
#[reporter]SignalHander(signal:6)(pid:19025)
#[reporter]SignalHander(signal:6)(pid:19025)
2
#[reporter]debugin@playmp3_by_list!
*** glibc detected *** free(): invalid pointer: 0x0000003e528346b8 ***
#[reporter]SignalHander(signal:6)(pid:32354)
#[reporter]SignalHander(signal:6)(pid:32354)
#[reporter]SignalHander(signal:6)(pid:32354)
红 帽企业 Linux 4 提供的 glibc 可以执行附加的内部数据 健全检查,从而在尽可能早的时候发现和保护数据被破坏。在默认的情况下,当被破坏的数据被发现时,与以下相似的错误信息会被显示在标准的错误输出上(如果 stderr 没有打开,会被记录在 syslog 中):
*** glibc detected *** double free or corruption: 0x0937d008 ***
在默认的情况下,产生这个错误的程序也会被中止。但是,这(以及是否产生错误信息)可以通过环境变量 MALLOC_CHECK_ 来控制。以下的设置 是被支持的:
0 - 不产生错误信息,也不中止这个程序
1 - 产生错误信息,但是不中止这个程序
2 - 不产生错误信息,但是中止这个程序
3 - 产生错误信息,并中止这个程序
备注
如果 MALLOC_CHECK_ 被设置为除 0 以外的值,这会使 glibc 进行更多的检查并可能影响到系统 的性能。
常用Linux内存管理 及调试工具
在Linux下,除了Gdb,还有很多调试工具,例如Binutil系列工具、Glibc提供的内存检测工具、MemWatch内存错误检测工具以及valgrind工具。它们都各有所长,侧重方面有所不同。
有个简单的办法。
#include <stdio.h>
#include <stdlib.h>
void *
mymtom_malloc(size_t size)
{
void *p;
p = malloc(size);
printf("malloc() size=0x%lu, p=0x%lx\n", (unsigned long)size, (unsigned long)p);
return p;
}
#define malloc(s) mymtom_malloc(s)
#define free(p) do { \
printf("%s:%d:%s:free(0x%lx)\n", __FILE__, __LINE__, \
__func__, (unsigned long)p); \
free(p); \
} while (0)
int
main(int argc, char *argv[])
{
char *p;
p = malloc(1024);
free(p);
return 0;
}
用上面的方法可以记录free的位置和参数,如果要记录malloc的位置,稍微复杂一点
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h>
#include <stdlib.h>
void *
debug_malloc(size_t size, const char *file, int line, const char *func)
{
void *p;
p = malloc(size);
printf("%s:%d:%s:malloc(%ld): p=0x%lx\n",
file, line, func, size, (unsigned long)p);
return p;
}
#define malloc(s) debug_malloc(s, __FILE__, __LINE__, __func__)
#define free(p) do { \
printf("%s:%d:%s:free(0x%lx)\n", __FILE__, __LINE__, \
__func__, (unsigned long)p); \
free(p); \
} while (0)
int
main(int argc, char *argv[])
{
char *p;
p = malloc(1024);
free(p);
return 0;
}
编译时加 -g, /etc/profile里打开core dump文件的生成!
再出现错误,追踪这个生成的core文件即可!
gdb -c core.232 yourprogram
参考
http://topic.csdn.net/u/20090812/15/43cae1c5-938d-4dac-a5f2-192f262d30f5.html