堆栈粉碎后如何处理错误信息

时间:2010-02-21 19:53:47

标签: c linux memory stack-overflow

我在Linux上的C程序遇到了一些问题。它在Windows上编译并运行得很好。 Linux终端返回此信息:

*** stack smashing detected ***: ./student terminated       
======= Backtrace: =========                                
/lib/libc.so.6(__fortify_fail+0x4b)[0xb7e908ab]             
/lib/libc.so.6(__fortify_fail+0x0)[0xb7e90860]              
./student[0x8048c09]                                        
./student[0x80486dd]                                        
/lib/libc.so.6(__libc_start_main+0xe5)[0xb7dc0775]
./student[0x80485e1]
======= Memory map: ========
08048000-0804a000 r-xp 00000000 00:11 11222      /mnt/win/POT03/Eclipse/student
0804a000-0804b000 r--p 00001000 00:11 11222      /mnt/win/POT03/Eclipse/student
0804b000-0804c000 rw-p 00002000 00:11 11222      /mnt/win/POT03/Eclipse/student
0804c000-0821a000 rw-p 0804c000 00:00 0          [heap]
b7da9000-b7daa000 rw-p b7da9000 00:00 0
b7daa000-b7eeb000 r-xp 00000000 75:00 116292     /lib/libc-2.9.so
b7eeb000-b7eed000 r--p 00141000 75:00 116292     /lib/libc-2.9.so
b7eed000-b7eee000 rw-p 00143000 75:00 116292     /lib/libc-2.9.so
b7eee000-b7ef1000 rw-p b7eee000 00:00 0
b7ef4000-b7f01000 r-xp 00000000 75:00 116275     /lib/libgcc_s.so.1
b7f01000-b7f02000 r--p 0000c000 75:00 116275     /lib/libgcc_s.so.1
b7f02000-b7f03000 rw-p 0000d000 75:00 116275     /lib/libgcc_s.so.1
b7f03000-b7f06000 rw-p b7f03000 00:00 0
b7f06000-b7f22000 r-xp 00000000 75:00 116288     /lib/ld-2.9.so
b7f22000-b7f23000 r--p 0001b000 75:00 116288     /lib/ld-2.9.so
b7f23000-b7f24000 rw-p 0001c000 75:00 116288     /lib/ld-2.9.so
bf8eb000-bf900000 rw-p bf8eb000 00:00 0          [stack]
ffffe000-fffff000 r-xp 00000000 00:00 0          [vdso]
Aborted

如何使用此信息来追踪问题?

2 个答案:

答案 0 :(得分:7)

使用调试信息编译程序,然后使用valgrind运行。

gcc -g student.cpp -o student
valgrind ./student

尝试调试器:

gcc -g student.cpp -o student
gdb ./student
run
     // wait for it to crash
backtrace
help // to figure out what else you can do

答案 1 :(得分:1)

首先你需要一个地图文件。从映射文件中,您可以查找内存地址(0x8048c09)。该函数实际上将从堆栈中地址之前的地址开始。从这里你知道你崩溃了哪个函数,并且对生成的汇编程序有一点了解,你可以弄清楚它崩溃的函数有多远。然后,您查看代码并尝试弄清楚您做错了什么。

失败...使用调试器。然后,您将能够看到它坠毁的行踪。从那里你甚至可以(如果你正在运行一个优化的构建,你将能够)看到你究竟在调用什么以及参数是什么。然后,您可以看到导致问题的原因,并且可以阻止它发生。