Di GDB, bagaimana saya bisa melompat langsung ke bingkai tumpukan panggilan paling atas?


9

Saya memiliki program C yang seg kesalahan setelah turun jauh ke dalam kekacauan rekursif tak terbatas. Backtracing proses di GDB tidak berguna karena bingkai tumpukan panggilan setidaknya 1000 frame, dan panggilan fungsi berulang adalah serangkaian empat panggilan fungsi rekursif umum (sehingga breakpoints tampak tidak berguna). Panggilan berulang ke backtrace hanya membacakan empat nama fungsi, berulang-ulang. Terpikir oleh saya bahwa melakukan 'naik' 'naik' '... akan membuat saya lebih tinggi, jadi saya bisa melihat di mana pola ini pertama kali mulai terjadi, tetapi tampaknya akan lebih efisien untuk memulai dari panggilan teratas susun bingkai dan turunkan saja, karena dugaan saya adalah bahwa rekursi tak terbatas dimulai pada awal proses. Jika tumpukan panggilan memiliki total N frame, saya tahu saya bisa melakukannya

gdb>> up N

untuk sampai ke bagian atas tumpukan (frame N), tetapi masalahnya adalah saya tidak tahu N. Apakah ada perintah untuk menemukan jumlah total frame dalam panggilan stack? Atau, apakah ada perintah GDB bawaan bawaan untuk melompat ke bingkai paling atas? Terpikir oleh saya bahwa frame paling atas harus menjadi fungsi utama () - dapatkah saya memanfaatkan pengetahuan itu untuk sampai ke frame paling atas?

Jawaban:


9

Dalam pengujian saya, menggunakan 'naik' dengan jumlah yang sangat besar menghasilkan bingkai paling atas yang ditampilkan, misalnya

(gdb) up 99999
#58 0x0000000000442fb4 in main ()

1
Tidak berfungsi jika ukuran tumpukan lebih besar dari 99999
The Vivandiere

Jawaban ini berhasil untuk saya, hanya perlu menggunakan angka yang lebih besar.
tesch1

23

Anda dapat menentukan 'bt' dengan angka negatif untuk memulai dari frame paling atas:

bt -20

Anda kemudian dapat menggunakan 'bingkai' (atau 'f') untuk langsung pergi ke bingkai yang Anda inginkan.


1

fr 0akan membawa Anda ke bingkai tumpukan paling atas. frsingkatan dari frame.


2
itu arah yang salah
tesch1

@ tesch1 cukup adil, tetapi gdb backtrace menunjukkan Anda bagian bawah di atas :)
The Vivandiere
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.