新手求助!关于段错误等问题。
时间: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下编程,望各位赐教。谢谢!
下面代码是我自己写的,在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

/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

/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
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28