É possível inspecionar o valor de retorno de uma função no gdb assumindo que o valor de retorno não é atribuído a uma variável?
103
É possível inspecionar o valor de retorno de uma função no gdb assumindo que o valor de retorno não é atribuído a uma variável?
Imagino que haja maneiras melhores de fazer isso, mas o comando terminar é executado até que o quadro da pilha atual seja exibido e imprima o valor de retorno - dado o programa
int fun() {
return 42;
}
int main( int argc, char *v[] ) {
fun();
return 0;
}
Você pode depurá-lo como tal -
(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)
O finish
comando pode ser abreviado como fin
. NÃO use o f
, que é a abreviatura de frame
command!
Sim, basta examinar o
EAX
registro digitandoprint $eax
. Para a maioria das funções, o valor de retorno é armazenado nesse registro, mesmo se não for usado.As exceções são funções que retornam tipos maiores que 32 bits, especificamente inteiros de 64 bits (
long long
),double
s estructs
ouclasses
.A outra exceção é se você não estiver executando em uma arquitetura Intel. Nesse caso, você terá que descobrir qual registro é usado, se houver.
fonte
Veja como fazer isso sem símbolos.
A formatação está meio confusa, observe o uso de "info frame" para inspecionar frames e "frame #" para navegar seu contexto para outro contexto (para cima e para baixo na pilha)
bt também mostra uma pilha abreviada para ajudar.
fonte