przeglądanie stosu

przeglądanie stosu
MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:199
0

Cześć :)
Jak w gdb można podglądnąć jak wygląda stos "w pobliżu" rozkazu, który jest obecnie wykonywany?
Chyba, że jakoś inaczej- ja chciałbym po prostu prześledzić jak odbywa się realizacja wyjątków od kuchni w C++.
pozdro :)

mwl4
  • Rejestracja:około 12 lat
  • Ostatnio:16 dni
  • Lokalizacja:Wrocław
  • Postów:399
0

Nie lepiej po prostu disassembler? Wtedy bez problemu sprawdzisz sobie wszystko co cię interesuje.


Asm/C/C++
Bartosz Wójcik
Disassembler stosu Ci nie pokaże, chyba, że chodzi o strukturę zmiennych lokalnych w obszarze funkcji. Faktyczny stan stosu pokaże za to debugger.
mwl4
Ty to chyba nie wiesz za bardzo o czym mówisz.
Bartosz Wójcik
Stos to obszar pamięci przydzielony do procesu, po uruchomieniu procesu jego koniec wskazany jest w rejestrze ESP (x86). Więc jak chcesz to oglądać disassemblerem jak go tam po prostu nie ma? Wydaje mi się, że naoglądałeś się za dużo Hackers z Angelina Jolie i po prostu mylą Ci się fakty :)
mwl4
Ja nie napisałem disassembler w sensie aby sprawdzać w nim stos, ale żeby sprawdzić jak wspomniane przez kolegę działają wyjątki.
Bartosz Wójcik
Obsługę wyjątków najlepiej obserwuje się dynamicznie, więc i tak co ci da deasembler? Że zobaczysz jak ustawiany jest SEH / VEH frame? W debuggerze zobaczysz jak to się na żywo odbywa, będziesz widział skonstruowany SEH chain, prześledzisz działanie systemowego handlera wyjątków.
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:2 dni
  • Lokalizacja:Szczecin
1

Poczytaj najnowszego "Programistę" - tam to jest fajnie opisane, a patrząc na zawartości stosu czy rejestrów to sam wiele nie zrozumiesz.


MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:199
0

ok, to poleć jakiś disassembler na linux, ewentualnie na windows.

n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:2412
3

Co rozumiesz przez przegladanie stosu? Wyswietlanie zmiennych lokalnych? Wyswietlanie obecnej/poprzednich ramek stosu?

Anyway...

Kopiuj
#include <stdio.h>

int main() {
  int a = 10, b = 20;
  printf("%d %d", a, b);
  return 0;
}

Majac taki program jak powyzej.

  1. Kompilujesz program gcc foo.c -o foo --debug
  2. Odpalasz gdb gdb foo
  3. Ustawiasz breakpointa zalozmy na linii z printf break foo.c: 5
  4. Uruchamiasz program run, zeby zatrzymal sie na ustawionym breakpointcie.
  5. frame bez argumentow ci wyswietli aktualna ramke stosu | info locals wyswietli ci zmienne lokalne wraz z wartosciami.

Przyklad dzialania i outputu (nazwa pliku bedzie ciut inna):

Kopiuj
(gdb) break hello_world.c: 5
Breakpoint 1 at 0x804841a: file hello_world.c, line 5.
(gdb) run
Starting program: /home/vixlur/Desktop/Others/hello_world

Breakpoint 1, main () at hello_world.c:5
5	  printf("%d %d", a, b);
(gdb) frame
#0  main () at hello_world.c:5
5	  printf("%d %d", a, b);
(gdb) info locals
a = 10
b = 20
(gdb) 

Do poczytania: http://www.chemie.fu-berlin.de/chemnet/use/info/gdb/gdb_7.html

Jeszcze odpowiadajac na ostatnie pytanie:

ok, to poleć jakiś disassembler na linux, ewentualnie na windows.

Jesli moze byc windows, to darmowa wersja IDA wydaje sie byc najlepszym rozwiazaniem. Na linuxa afair darmowa jest niedostepna.

edytowany 1x, ostatnio: n0name_l
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Polecam użyć graficznej nakładki na GDB jaką masz w Eclipse CDT ;)


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Bartosz Wójcik
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 4 lata
  • Postów:439
1

Mogę jedynie polecić debuggery na Windows, gdyż na Linuxie nie siedzę.

  1. Darmowy debugger OllyDbg v2 - http://www.ollydbg.de/version2.html - znakomita analiza kodu i prezentacja danych

Koniec ;). Chyba, że stać Cię na deasembler z wbudowanym debuggerem jak np. IDA (jest demówka, ale nie pamiętam czy posiada wbudowany debugger).

Cała reszta to syf nie warty instalowania.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.