2012-05-14 11 views
7

Chciałbym uzyskać dostęp do ramek przechowywanych w głównym zrzucie programu, który nie ma symboli debugowania (chcę to zrobić w C). Kiedy otwieram program i zrzut rdzenia wewnątrz GDB, otrzymuję ślad stosu zawierający nazwy funkcji. Na przykład:Jak odczytywać klatki ze zrzutu pamięci (bez GDB)?

(gdb) bt 
#0 0x08048443 in layer3() 
#1 0x08048489 in layer2() 
#2 0x080484c9 in layer1() 
#3 0x0804854e in main() 

Nazwy wszystkich funkcji są przechowywane w pliku wykonywalnym w sekcji .strtab. Jak mogę utworzyć ślad stosu z różnymi ramkami? Uruchamianie GDB w trybie wsadowym to , a nie opcja. A także "kopiowanie części z gdb są potrzebne" jest również złym pomysłem, ponieważ kod nie jest napisany niezależnie.

Tak, aby moje pytanie było bardziej precyzyjne: Gdzie znajdę punkt wewnątrz zrzutu pamięci, w którym mogę zacząć czytać informacje o stosie? Czy istnieje jakaś biblioteka do uzyskiwania dostępu do tych informacji? Strukturę, której mogę użyć? A może jeszcze lepiej, dokumentacja w jaki sposób informacje te są uporządkowane wewnątrz zrzutu pamięci?

(ja już widziałem na pytanie „how to generate a stack trace from a core dump file in C, without invoking an external tool such as gdb”, ale ponieważ nie jest ważna odpowiedź, myślałem, że chciałbym go zapytać ponownie)

[Edytuj] Robię to pod Linux x86

+3

Windows, Linux lub MacOS? x86, x86_64, PPC, Arm ....? – Flexo

+0

O kurwa, przepraszam, zapomniałem! Linux, x86 – Uhlo

+0

http://www.kernel.org/doc/man-pages/online/pages/man5/core.5.html – Flexo

Odpowiedz

7

Coredump zawiera również informacje o stosie. Jeśli możesz użyć tej informacji o stosie wraz z wartościami rejestru EBP i EIP w pliku coredump, możesz wydrukować ślad stosu. Napisałem program, aby to zrobić. Możesz znaleźć program w poniższym linku.

http://www.emntech.com/programs/corestrace.c 

Zastosowanie: Kompilacja powyższy program i dać corefile kiedy go wykonać.

 $corestrace core 

Jeśli chcesz symbole być również drukowane, robisz tak: Załóżmy, że program, który wygenerował rdzeń jest „test”.

 $ nm -n test > symbols 
     $ corestrace core symbols 

Przykładowe wyjście wygląda następująco:

 $ ./coretrace core symbols 

     0x80483cd foo+0x9 
     0x8048401 func+0x1f 
     0x8048430 main+0x2d 
+0

To bardzo pomogło, dzięki! – Uhlo

+0

Link już nie działa, ale znalazłem kopię na http://emntech.blogspot.com/2012/08/printing-backtracestack-trace-using.html – mephi42

+0

Dodano istotną kwestię: https: //gist.github .com/root42/c979b037f85dc4b2be1f3735afedeb1d – Arne

Powiązane problemy