Mencetak semua variabel global / variabel lokal?

337

Bagaimana saya bisa mencetak semua variabel global / variabel lokal? Apakah itu mungkin di gdb?

cpuer
sumber

Jawaban:

490

Ketikkan info variableske daftar "Semua nama variabel global dan statis".

Ketik info localsuntuk daftar "Variabel lokal dari frame stack saat ini" (nama dan nilai), termasuk variabel statis dalam fungsi itu.

Ketik info argsuntuk daftar "Argumen dari frame stack saat ini" (nama dan nilai).

kennytm
sumber
2
@ KennyTM, nama variabel statis dalam output info variablesharus variabel statis dalam unit kompilasi, kan?
cpuer
3
@cpuer: Belum tentu. Ini hanya menampilkan nama dalam tabel simbol. Misalnya, dengan gcc pada Mac, variabel statis ydiubah namanya menjadi y.1913saat dikompilasi.
kennytm
1
@ KennyTM, bukankah variabel statis di dalam fungsi disimpan dengan cara yang sama seperti variabel statis di luar fungsi (dalam tabel simbol)?
cpuer
2
@cpuer: Mereka disimpan dengan cara yang sama tetapi nama simbol akan berbeda. Pertimbangkan Anda memiliki variabel statis ydalam fungsi foodan lain ydi bar. Untuk membedakan mereka, nama yang berbeda harus ditetapkan untuk keduanya y.
kennytm
1
@ KennyTM, lebih jauh lagi, apakah mungkin untuk mendapatkan tempat variabel dideklarasikan dan didefinisikan masing-masing?
cpuer
110

Jika Anda ingin melihat variabel lokal dari fungsi panggil gunakan select-framesebelumnyainfo locals

Misalnya:

(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
sumber
4
( select-framedapat disingkat sel. Atau gunakan frame/ f, yang juga mencetak bingkai)
user202729
27

Selain itu, karena info localstidak menampilkan argumen ke fungsi Anda, gunakan

(gdb) info args

Sebagai contoh:

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

argcdan argvtidak akan ditampilkan oleh info locals. Pesannya adalah "Tidak ada penduduk setempat."

Referensi: info perintah penduduk setempat .

Evgeni Sergeev
sumber
Satu referensi yang sebenarnya ada di sini: sourceware.org/gdb/current/onlinedocs/gdb/Frame-Info.html
Johan Boulé