Chinaunix

标题: [求助]*** glibc detected *** double free or corruption (!prev): 0x08207308 *** [打印本页]

作者: 源方    时间: 2007-03-26 15:05
标题: [求助]*** glibc detected *** double free or corruption (!prev): 0x08207308 ***
*** glibc detected *** double free or corruption (!prev): 0x08207308 ***
请问0x08207308表示什么意思。是出错的内存地址吗?怎么才能知道是哪一句出了错?
作者: flw    时间: 2007-03-26 15:11
gdb 之~
然后 bt
或者 ltrace 也行。
作者: 源方    时间: 2007-03-26 15:25
原帖由 flw 于 2007-3-26 15:11 发表
gdb 之~
然后 bt
或者 ltrace 也行。

怎么用?大概说说呗。没用过ltrace
作者: flw    时间: 2007-03-26 15:39
原帖由 源方 于 2007-3-26 15:25 发表

怎么用?大概说说呗。没用过ltrace

man
作者: antzcn    时间: 2007-03-26 15:51
http://www.redhat.com/docs/manua ... lease-notes/as-x86/

glibc

    *

      红帽企业 Linux 4 提供的 glibc 可以执行附加的内部数据健全检查,从而在尽可能早的时候发现和保护数据被破坏。在默认的情况下,当被破坏的数据被发现时,与以下相似的错误信息会被显示在标准的错误输出上(如果 stderr 没有打开,会被记录在 syslog 中):

      *** glibc detected *** double free or corruption: 0x0937d008 ***

      在默认的情况下,产生这个错误的程序也会被中止。但是,这(以及是否产生错误信息)可以通过环境变量 MALLOC_CHECK_ 来控制。以下的设置是被支持的:
            0 — 不产生错误信息,也不中止这个程序
            1 — 产生错误信息,但是不中止这个程序
            2 — 不产生错误信息,但是中止这个程序
            3 — 产生错误信息,并中止这个程序
      备注
      如果 MALLOC_CHECK_ 被设置为除 0 以外的值,这会使 glibc 进行更多的检查并可能影响到系统的性能。

      如果您的由第三方 ISV 提供的程序会引发这些数据破坏检查并显示错误信息,您应该向这个程序的提供者提交一个错误报告,因为它代表了一个严重的错误。

作者: antzcn    时间: 2007-03-26 15:56
标题: a sample code to generate this error

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4. FILE *fs;

  5. fs=fopen("./test", "w");
  6. fclose(fs);
  7. fclose(fs);
  8. }
复制代码


[root@localhost tmp]# gcc g.c
[root@localhost tmp]# ./a.out
*** glibc detected *** ./a.out: double free or corruption (top): 0x08584008 ***
======= Backtrace: =========
/lib/libc.so.6[0x164f18]
/lib/libc.so.6(__libc_free+0x79)[0x16841d]
/lib/libc.so.6(fclose+0x143)[0x155443]
./a.out[0x8048412]
/lib/libc.so.6(__libc_start_main+0xdc)[0x1167e4]
./a.out[0x8048351]
======= Memory map: ========
00101000-0022d000 r-xp 00000000 03:09 2262934    /lib/libc-2.4.so
0022d000-00230000 r-xp 0012b000 03:09 2262934    /lib/libc-2.4.so
00230000-00231000 rwxp 0012e000 03:09 2262934    /lib/libc-2.4.so
00231000-00234000 rwxp 00231000 00:00 0
00497000-004a2000 r-xp 00000000 03:09 2262939    /lib/libgcc_s-4.1.0-20060304.so.1
004a2000-004a3000 rwxp 0000a000 03:09 2262939    /lib/libgcc_s-4.1.0-20060304.so.1
00512000-0052b000 r-xp 00000000 03:09 2262894    /lib/ld-2.4.so
0052b000-0052c000 r-xp 00018000 03:09 2262894    /lib/ld-2.4.so
0052c000-0052d000 rwxp 00019000 03:09 2262894    /lib/ld-2.4.so
006d7000-006d8000 r-xp 006d7000 00:00 0          [vdso]
08048000-08049000 r-xp 00000000 03:09 2429540    /tmp/a.out
08049000-0804a000 rw-p 00000000 03:09 2429540    /tmp/a.out
08584000-085a5000 rw-p 08584000 00:00 0          [heap]
b7e00000-b7e21000 rw-p b7e00000 00:00 0
b7e21000-b7f00000 ---p b7e21000 00:00 0
b7faa000-b7fab000 rw-p b7faa000 00:00 0
b7fc6000-b7fc7000 rw-p b7fc6000 00:00 0
bfab1000-bfac7000 rw-p bfab1000 00:00 0          [stack]
Aborted
作者: 源方    时间: 2007-03-26 15:56
谢谢楼上的。我的程序还会提示Segmentation fault ,段错误
作者: gnap    时间: 2007-03-26 16:01
原帖由 源方 于 2007-3-26 15:56 发表
谢谢楼上的。我的程序还会提示Segmentation fault ,段错误


继续用gdb跟踪。
作者: antzcn    时间: 2007-03-26 16:02
原帖由 源方 于 2007-3-26 15:56 发表
谢谢楼上的。我的程序还会提示Segmentation fault ,段错误


检查程序,在使用变量时要进行有效性检查等等~!
作者: flw    时间: 2007-03-26 16:05
原帖由 源方 于 2007-3-26 15:56 发表
谢谢楼上的。我的程序还会提示Segmentation fault ,段错误

gdb 之~
然后 bt
或者 ltrace 也行。
作者: antzcn    时间: 2007-03-26 16:07
原帖由 gnap 于 2007-3-26 16:01 发表


继续用gdb跟踪。


FYI

http://www.ibm.com/developerworks/cn/linux/tips/l-gdb/index1.html
作者: 源方    时间: 2007-03-26 16:08
原帖由 antzcn 于 2007-3-26 15:56 发表

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4. FILE *fs;

  5. fs=fopen("./test", "w");
  6. fclose(fs);
  7. fclose(fs);
  8. }
复制代码


[root@localhost tmp]# gcc g.c
[root@lo ...


没看懂。Aborted也没说在哪一行。我的程序打日志时还提示Segmentation fault 。我没什么办法了
你告诉我该做什么我自己研究吧
作者: antzcn    时间: 2007-03-26 16:10
原帖由 源方 于 2007-3-26 16:08 发表


没看懂。Aborted也没说在哪一行。我的程序打日志时还提示Segmentation fault 。我没什么办法了
你告诉我该做什么我自己研究吧



大家发的几个贴子包含了关于这个错误的原因和解决方法。万一,把代码贴出来吧~!

[ 本帖最后由 antzcn 于 2007-3-26 16:16 编辑 ]
作者: 源方    时间: 2007-03-26 16:15
原帖由 antzcn 于 2007-3-26 16:10 发表



把代码贴出来吧~!

谢谢。代码太多了。没法贴出来
我的运行环境(简化的slackware)里没有gdb。我从别的机器copy一个试一试

[ 本帖最后由 源方 于 2007-3-26 16:20 编辑 ]
作者: antzcn    时间: 2007-03-26 16:23
原帖由 源方 于 2007-3-26 16:15 发表

谢谢。代码太多了。没法贴出来
我的运行环境(简化的slackware)里没有gdb。我从别的机器copy一个试一试


使用GDB找出出错的那一行。如果没有GDB,你可以在代码中屏蔽可能出错的代码,并逐步缩小直至出错的那一行。
作者: 源方    时间: 2007-03-26 16:42
我生成的是一个守护进程daemon。由a.c b.c和service.c(包含main函数)。怎么样让这个进程运行时调试。
用gdb daemon不行
作者: boxpei    时间: 2007-03-27 14:40
printf。最好的调试工具。
作者: lipps    时间: 2011-06-23 09:23
用gdb attach 上去看看, 应该能定位到出错的位置




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2