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的位置,稍微复杂一点

 

View Code
#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

posted @ 2011-12-08 16:14  夏大王  阅读(1958)  评论(0编辑  收藏  举报