Czy można sprawdzić wartość zwracaną przez funkcję w gdb, zakładając, że wartość zwracana nie jest przypisana do zmiennej?
103
Czy można sprawdzić wartość zwracaną przez funkcję w gdb, zakładając, że wartość zwracana nie jest przypisana do zmiennej?
Wyobrażam sobie, że są lepsze sposoby, aby to zrobić, ale polecenie finish jest wykonywane, dopóki bieżąca ramka stosu nie zostanie zdjęta i nie wyświetli wartości zwracanej - biorąc pod uwagę program
int fun() {
return 42;
}
int main( int argc, char *v[] ) {
fun();
return 0;
}
Możesz go debugować jako taki -
(gdb) r
Starting program: /usr/home/hark/a.out
Breakpoint 1, fun () at test.c:2
2 return 42;
(gdb) finish
Run till exit from #0 fun () at test.c:2
main () at test.c:7
7 return 0;
Value returned is $1 = 42
(gdb)
finish
Polecenia można w skrócie fin
. NIE używaj f
, który jest skrótem frame
polecenia!
Tak, po prostu sprawdź
EAX
rejestr, wpisującprint $eax
. W przypadku większości funkcji zwracana wartość jest przechowywana w tym rejestrze, nawet jeśli nie jest używana.Wyjątkami są funkcje zwracające typy większe niż 32 bity, w szczególności 64-bitowe liczby całkowite (
long long
),double
s istructs
lubclasses
.Innym wyjątkiem jest sytuacja, gdy nie korzystasz z architektury Intel. W takim przypadku musisz dowiedzieć się, który rejestr jest używany, jeśli w ogóle.
źródło
Oto jak to zrobić bez symboli.
Formatowanie jest trochę pomieszane, zwróć uwagę na użycie „ramki informacyjnej” do sprawdzania ramek i „ramki #” do nawigacji w kontekście do innego kontekstu (w górę iw dół stosu)
bt również pokazuje skrócony stos, aby pomóc.
źródło