分段故障

时间:2011-03-29 12:19:16

标签: c segmentation-fault

  

可能重复:
  Segmentation fault in btree implementation

我收到这样的错误,我该怎么调试呢?你能给一些方法来调试这个错误:

  *** glibc detected *** ./a.out: free(): invalid pointer: 0x0821b158 ***
    ======= Backtrace: =========
    /lib/tls/i686/cmov/libc.so.6(+0x6b591)[0xbd7591]
    /lib/tls/i686/cmov/libc.so.6(+0x6cde8)[0xbd8de8]
    /lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0xbdbecd]
    ./a.out[0x80490c3]
    ./a.out[0x8048bdc]
    ./a.out[0x8048642]
    /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0xb82bd6]
    ./a.out[0x80484b1]
    ======= Memory map: ========
    004e5000-00500000 r-xp 00000000 08:06 1192669    /lib/ld-2.11.1.so
    00500000-00501000 r--p 0001a000 08:06 1192669    /lib/ld-2.11.1.so
    00501000-00502000 rw-p 0001b000 08:06 1192669    /lib/ld-2.11.1.so
    007aa000-007c7000 r-xp 00000000 08:06 1179731    /lib/libgcc_s.so.1
    007c7000-007c8000 r--p 0001c000 08:06 1179731    /lib/libgcc_s.so.1
    007c8000-007c9000 rw-p 0001d000 08:06 1179731    /lib/libgcc_s.so.1
    0096b000-0096c000 r-xp 00000000 00:00 0          [vdso]
    00b6c000-00cbf000 r-xp 00000000 08:06 1311379    /lib/tls/i686/cmov/libc-2.11.1.so
    00cbf000-00cc0000 ---p 00153000 08:06 1311379    /lib/tls/i686/cmov/libc-2.11.1.so
    00cc0000-00cc2000 r--p 00153000 08:06 1311379    /lib/tls/i686/cmov/libc-2.11.1.so
    00cc2000-00cc3000 rw-p 00155000 08:06 1311379    /lib/tls/i686/cmov/libc-2.11.1.so
    00cc3000-00cc6000 rw-p 00000000 00:00 0 
    08048000-0804a000 r-xp 00000000 08:06 393339     /home/user/Desktop/a.out
    0804a000-0804b000 r--p 00001000 08:06 393339     /home/user/Desktop/a.out
    0804b000-0804c000 rw-p 00002000 08:06 393339     /home/user/Desktop/a.out
    0821b000-0823c000 rw-p 00000000 00:00 0          [heap]
    b7600000-b7621000 rw-p 00000000 00:00 0 
    b7621000-b7700000 ---p 00000000 00:00 0 
    b7708000-b7709000 rw-p 00000000 00:00 0 
    b771a000-b771e000 rw-p 00000000 00:00 0 
    bfc39000-bfc4e000 rw-p 00000000 00:00 0          [stack]
    Aborted

2 个答案:

答案 0 :(得分:5)

使用debug(gcc -g *.c)进行构建,然后查看堆栈。

特别是这个错误是因为您在错误的指针上调用了free

某些代码可能会帮助我们更具体地查看您的问题。

答案 1 :(得分:1)

您可能会发现调试此类错误的最简单方法是使用调试器。

正如Starkey建议的那样,请确保在编译时启用调试符号(通过-g选项到gcc)。

您可能会发现,当您的程序因分段故障而崩溃时,它会生成核心文件。您可以使用调试器(例如gdb)打开核心文件并调查调用堆栈。使用调试器的优点是它(如果你启用了调试符号)会显示源文件中的行号,而不仅仅是提供内存位置。

如果您没有核心文件,可以在gdb中运行应用程序,然后重现分段错误。