+ -
当前位置:首页 → 问答吧 → 新手求助!关于段错误等问题。

新手求助!关于段错误等问题。

时间:2010-09-01

来源:互联网

本帖最后由 CdotY 于 2010-09-01 20:38 编辑

下面代码是我自己写的,在main中open一个文件,再把文件描述符传进来。然后进行测试。
运行到free1的时候会出现 段错误 ,而在运行到free2的时候出现如下信息(free1和free2是两处free函数,编号区分):
*** glibc detected *** ./ELFInfo: free(): invalid pointer: 0x08572009 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(+0x6b591)[0x58f591]
/lib/tls/i686/cmov/libc.so.6(+0x6cde[0x590de8]
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0x593ecd]
./ELFInfo(IsELF+0xd5)[0x8048849]
./ELFInfo(main+0xa4)[0x80488fb]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x53abd6]
./ELFInfo[0x80486e1]
======= Memory map: ========
00110000-0012d000 r-xp 00000000 08:01 2097235    /lib/libgcc_s.so.1
0012d000-0012e000 r--p 0001c000 08:01 2097235    /lib/libgcc_s.so.1
0012e000-0012f000 rw-p 0001d000 08:01 2097235    /lib/libgcc_s.so.1
00524000-00677000 r-xp 00000000 08:01 2097201    /lib/tls/i686/cmov/libc-2.11.1.so
00677000-00678000 ---p 00153000 08:01 2097201    /lib/tls/i686/cmov/libc-2.11.1.so
00678000-0067a000 r--p 00153000 08:01 2097201    /lib/tls/i686/cmov/libc-2.11.1.so
0067a000-0067b000 rw-p 00155000 08:01 2097201    /lib/tls/i686/cmov/libc-2.11.1.so
0067b000-0067e000 rw-p 00000000 00:00 0
009d1000-009ec000 r-xp 00000000 08:01 2101178    /lib/ld-2.11.1.so
009ec000-009ed000 r--p 0001a000 08:01 2101178    /lib/ld-2.11.1.so
009ed000-009ee000 rw-p 0001b000 08:01 2101178    /lib/ld-2.11.1.so
00d8c000-00d8d000 r-xp 00000000 00:00 0          [vdso]
08048000-08049000 r-xp 00000000 08:01 14421556   /home/xxx/ELFInfo
08049000-0804a000 r--p 00000000 08:01 14421556   /home/xxx/ELFInfo
0804a000-0804b000 rw-p 00001000 08:01 14421556   /home/xxx/ELFInfo
08572000-08593000 rw-p 00000000 00:00 0          [heap]
b7600000-b7621000 rw-p 00000000 00:00 0
b7621000-b7700000 ---p 00000000 00:00 0
b772f000-b7730000 rw-p 00000000 00:00 0
b7740000-b7743000 rw-p 00000000 00:00 0
bfe22000-bfe37000 rw-p 00000000 00:00 0          [stack]
已放弃

free1用gdb进入后r命令出现如下:
Program received signal SIGSEGV, Segmentation fault.
0x0019dea9 in free () from /lib/tls/i686/cmov/libc.so.6

free2用gdb进入后r命令出现如下:
*** glibc detected *** /home/xxx/ELFInfo: free(): invalid pointer: 0x0804b009 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(+0x6b591)[0x199591]
/lib/tls/i686/cmov/libc.so.6(+0x6cde[0x19ade8]
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0x19decd]
/home/xxx/ELFInfo(IsELF+0xd5)[0x8048849]
/home/xxx/ELFInfo(main+0xa4)[0x80488fb]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x144bd6]
/home/xxx/ELFInfo[0x80486e1]
======= Memory map: ========
00110000-0012b000 r-xp 00000000 08:01 2101178    /lib/ld-2.11.1.so
0012b000-0012c000 r--p 0001a000 08:01 2101178    /lib/ld-2.11.1.so
0012c000-0012d000 rw-p 0001b000 08:01 2101178    /lib/ld-2.11.1.so
0012d000-0012e000 r-xp 00000000 00:00 0          [vdso]
0012e000-00281000 r-xp 00000000 08:01 2097201    /lib/tls/i686/cmov/libc-2.11.1.so
00281000-00282000 ---p 00153000 08:01 2097201    /lib/tls/i686/cmov/libc-2.11.1.so
00282000-00284000 r--p 00153000 08:01 2097201    /lib/tls/i686/cmov/libc-2.11.1.so
00284000-00285000 rw-p 00155000 08:01 2097201    /lib/tls/i686/cmov/libc-2.11.1.so
00285000-00288000 rw-p 00000000 00:00 0
00288000-002a5000 r-xp 00000000 08:01 2097235    /lib/libgcc_s.so.1
002a5000-002a6000 r--p 0001c000 08:01 2097235    /lib/libgcc_s.so.1
002a6000-002a7000 rw-p 0001d000 08:01 2097235    /lib/libgcc_s.so.1
08048000-08049000 r-xp 00000000 08:01 14421556   /home/xxx/ELFInfo
08049000-0804a000 r--p 00000000 08:01 14421556   /home/xxx/ELFInfo
0804a000-0804b000 rw-p 00001000 08:01 14421556   /home/xxx/ELFInfo
0804b000-0806c000 rw-p 00000000 00:00 0          [heap]
b7e00000-b7e21000 rw-p 00000000 00:00 0
b7e21000-b7f00000 ---p 00000000 00:00 0
b7fec000-b7fed000 rw-p 00000000 00:00 0
b7ffd000-b8000000 rw-p 00000000 00:00 0
bffeb000-c0000000 rw-p 00000000 00:00 0          [stack]

Program received signal SIGABRT, Aborted.
0x0012d422 in __kernel_vsyscall ()

我的代码如下:
int IsELF(int filedes)
{
    char *bufs;

    printf("ELFInfo:Loading...\n";
    bufs = malloc(EI_NIDENT);
    if (NULL != bufs)
    {
        read(filedes, bufs, EI_NIDENT);
        if ('E' == *++bufs && 'L' == *++bufs && 'F' == *++bufs)
        {
            if (ELFCLASS32 == *++bufs && ELFDATA2LSB == *++bufs && EV_CURRENT == *++bufs)
            {
                printf("ELFInfo:This file is a ELF File.\n";
                free(bufs);      //这里是free1
                bufs = NULL;
                return 1;
            }
        }
        printf("ELFInfo:This file isn't a ELF File.\n";
        free(bufs);    //这里是free2
        bufs = NULL;
    }

    return -1;
}

这是什么回事啊?我觉得我的代码没有问题,但不知道为什么会出错。。。
第一次在Linux下编程,望各位赐教。谢谢!

作者: CdotY   发布时间: 2010-09-01



QUOTE:
++bufs


bufs的值改变了,你再去free这个东西当然错了

作者: churchmice   发布时间: 2010-09-01

相关阅读 更多

热门下载

更多