Imprimindo todas as variáveis ​​globais / variáveis ​​locais?

337

Como posso imprimir todas as variáveis ​​globais / variáveis ​​locais? Isso é possível em gdb?

cpuer
fonte

Respostas:

488

Digite info variablespara listar "Todos os nomes de variáveis ​​globais e estáticas".

Digite info localspara listar "Variáveis ​​locais do quadro de pilha atual" (nomes e valores), incluindo variáveis ​​estáticas nessa função.

Digite info argspara listar "Argumentos do quadro de pilha atual" (nomes e valores).

kennytm
fonte
2
@ KennyTM, os nomes de variáveis ​​estáticas na saída de info variablesdevem ser variáveis ​​estáticas dentro dessa unidade de compilação, certo?
cpuer
3
@ pcuer: Não necessariamente. Ele exibe apenas o nome na tabela de símbolos. Por exemplo, com o gcc no Mac, uma variável estática yé renomeada para y.1913na compilação.
Kennytm
11
@KennyTM, as variáveis ​​estáticas dentro da função não são armazenadas da mesma maneira que as variáveis ​​estáticas fora da função (na tabela de símbolos)?
precisa saber é o seguinte
2
@ pcuer: Eles são armazenados da mesma maneira, mas os nomes dos símbolos serão diferentes. Considere que você tem uma variável estática yem função fooe outra yem bar. Para distingui-los, um nome diferente deve ser atribuído aos dois y.
Kennytm
11
@KennyTM, além disso, é possível chegar onde uma variável é declarada e definida, respectivamente?
cpuer
110

Caso deseje ver as variáveis ​​locais de uma função de chamada usadas select-frameantesinfo locals

Por exemplo:

(gdb) bt
#0  0xfec3c0b5 in _lwp_kill () from /lib/libc.so.1
#1  0xfec36f39 in thr_kill () from /lib/libc.so.1
#2  0xfebe3603 in raise () from /lib/libc.so.1
#3  0xfebc2961 in abort () from /lib/libc.so.1
#4  0xfebc2bef in _assert_c99 () from /lib/libc.so.1
#5  0x08053260 in main (argc=1, argv=0x8047958) at ber.c:480
(gdb) info locals
No symbol table info available.
(gdb) select-frame 5
(gdb) info locals
i = 28
(gdb) 
Samuel Åslund
fonte
4
( select-framepode ser abreviado como sel. Como alternativa, use frame/ f, que também imprime o quadro) #
user202729
27

Além disso, como info localsnão exibe os argumentos da função em que você está, use

(gdb) info args

Por exemplo:

int main(int argc, char *argv[]) {
    argc = 6*7;    //Break here.
    return 0;
}

argce argvnão será mostrado por info locals. A mensagem será "Nenhum local".

Referência: comando info locals .

Evgeni Sergeev
fonte
A única referência verdadeira está aqui: sourceware.org/gdb/current/onlinedocs/gdb/Frame-Info.html
Johan Boulé