Est-il possible d'inspecter la valeur de retour d'une fonction dans gdb en supposant que la valeur de retour n'est pas affectée à une variable?
103
Est-il possible d'inspecter la valeur de retour d'une fonction dans gdb en supposant que la valeur de retour n'est pas affectée à une variable?
J'imagine qu'il existe de meilleures façons de le faire, mais la commande de finition s'exécute jusqu'à ce que le cadre de pile actuel soit sorti et imprime la valeur de retour - étant donné le programme
int fun() {
return 42;
}
int main( int argc, char *v[] ) {
fun();
return 0;
}
Vous pouvez le déboguer en tant que tel -
(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)
La finish
commande peut être abrégée en fin
. N'utilisez PAS le f
, qui est l'abréviation de la frame
commande!
Oui, il suffit d'examiner le
EAX
registre en tapantprint $eax
. Pour la plupart des fonctions, la valeur de retour est stockée dans ce registre, même si elle n'est pas utilisée.Les exceptions à cette règle sont les fonctions retournant des types supérieurs à 32 bits, en particulier des entiers 64 bits (
long long
),double
s etstructs
ouclasses
.L'autre exception est si vous n'utilisez pas une architecture Intel. Dans ce cas, vous devrez déterminer quel registre est utilisé, le cas échéant.
la source
Voici comment procéder sans symboles.
Le formatage a un peu foiré là-haut, notez l'utilisation de "cadre d'informations" pour inspecter les cadres et de "cadre #" pour naviguer dans votre contexte vers un autre contexte (de haut en bas de la pile)
bt montre également une pile abrégée pour aider.
la source