执行C程序后的回溯和内存映射是什么

时间:2013-02-18 04:55:07

标签: c

我在正确运行程序并获得准确结果后遇到了以下内容,但我不理解它们。

glibc detected *** ./programa: double free or corruption (out): 0x089300a0 ***

======= Backtrace: =========
/lib/libc.so.6[0x8f8c65]
/lib/libc.so.6(cfree+0x59)[0x8fcc59]
./programa[0x804880a]
/lib/libc.so.6(__libc_start_main+0xdc)[0x8a4ebc]
./programa[0x80483e1]
======= Memory map: ========
00870000-0088b000 r-xp 00000000 08:04 1384259    /lib/ld-2.5.so
0088b000-0088c000 r-xp 0001a000 08:04 1384259    /lib/ld-2.5.so
0088c000-0088d000 rwxp 0001b000 08:04 1384259    /lib/ld-2.5.so
0088f000-009e6000 r-xp 00000000 08:04 1384270    /lib/libc-2.5.so
009e6000-009e8000 r-xp 00156000 08:04 1384270    /lib/libc-2.5.so
009e8000-009e9000 rwxp 00158000 08:04 1384270    /lib/libc-2.5.so
009e9000-009ec000 rwxp 009e9000 00:00 0
00ab3000-00abe000 r-xp 00000000 08:04 1384276    /lib/libgcc_s-4.1.2-20080825.so.1
00abe000-00abf000 rwxp 0000a000 08:04 1384276    /lib/libgcc_s-4.1.2-20080825.so.1
00ddb000-00ddc000 r-xp 00ddb000 00:00 0          [vdso]
08048000-08049000 r-xp 00000000 00:17 8620696    /users/c//programa
08049000-0804a000 rw-p 00000000 00:17 8620696    /users/c/programa
08930000-08951000 rw-p 08930000 00:00 0          [heap]
b7fcd000-b7fcf000 rw-p b7fcd000 00:00 0
b7fd8000-b7fda000 rw-p b7fd8000 00:00 0
bfe6f000-bfe84000 rw-p bffe9000 00:00 0          [stack]

Aborted

3 个答案:

答案 0 :(得分:3)

这是一次崩溃。要解决此问题,您可以采用以下方法之一。

使用GDB之类的调试器来运行程序并使用backtrace功能来找出崩溃函数。

检查您的代码是否免费。 (可能是您写入免费资源的代码。因为您提到您获得了准确的结果。)

在编译程序时,使用-Xlinker -Map=output.map选项与gcc。这将生成具有所有功能地址的可执行文件的映射文件。您可以映射错误指令地址或堆栈跟踪以查找导致崩溃的函数。

答案 1 :(得分:1)

这是你的程序中发生的崩溃。原因显示在第一行double free or corruption

由于您的预期输出很好,我的猜测是当您向最后释放资源时,您在同一位置的某个内存位置自由调用两次。

如果要发现这种情况并不容易,请使用GDB(如CCoder建议的那样)或任何其他此类调试器来跟踪它。发生此错误时,它们应该会中断。

答案 2 :(得分:0)

问题很可能是multiply指针的分配问题。 这段代码有问题:

   multiply = malloc(m * sizeof(int)); /* Should be "int*" and not "int" */
   for (i = 0; i < q; i++)
                   ^ - Allocation was for m in statement above
      multiply[i] = malloc(q * sizeof(int));

您为int分配了内存,而int *分配了multiply内存 为了避免这些错误,最好使用在malloc的调用中分配的指针,例如malloc (m * sizeof *multiply)。 另外,您可以看到malloc的{​​{1}}元素mmultiply,但为q分配。尝试在分配和释放时将q更改为m 有点像:

multiply = malloc(m * sizeof *multiply);
for (i = 0; i < m; i++)
  multiply[i] = malloc(q * sizeof *multiply[i]);

旁注:
main的签名应为int main(void),请注意,在C中,main()main(void)不同。

希望这有帮助!