Что делать с информацией об ошибках после разрушения стека - PullRequest
4 голосов
/ 21 февраля 2010

У меня возникли некоторые проблемы с моей программой на C на Linux. Он компилируется и прекрасно работает на 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 ]

7 голосов
/ 21 февраля 2010

Скомпилируйте вашу программу с отладочной информацией, затем запустите с использованием 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 голос
/ 21 февраля 2010

Для начала вам нужен файл карты. Из файла карты вы можете найти адрес памяти (0x8048c09). Функция будет фактически начинаться с адреса, предшествующего адресу в стеке. Отсюда вы знаете, в какой функции вы потерпели крах, и, немного разбираясь в сгенерированном ассемблере, вы сможете выяснить, как далеко в этой функции произошел сбой. Затем вы смотрите на код и пытаетесь выяснить, что вы делаете неправильно.

В противном случае ... использовать отладчик. Затем вы сможете увидеть, где он разбился. Оттуда вы можете даже иметь возможность (если вы используете оптимизированную сборку, вы сможете) увидеть, что именно вы вызываете и каковы параметры. Затем вы сможете увидеть причину проблемы и остановить ее возникновение.

...