gdb: bagaimana cara mencetak baris saat ini atau menemukan nomor baris saat ini?

94

list perintah mencetak satu set baris, tetapi saya membutuhkan satu baris, di mana saya berada dan di mana kesalahan mungkin telah terjadi.

Boris Burkov
sumber
23
backtraceatau where, bahkan info lineatau sekadar bt(untuk lacak balik). dirac.org/linux/gdb untuk tutorial gdb
dwalter
btatau backtraceatau wherecetak tumpukan panggilan fungsi, fatau framecetak baris berikutnya untuk dijalankan.
Eric Wang

Jawaban:

21

Saya mendapatkan informasi yang sama saat melakukan debug. Meskipun tidak saat saya memeriksa stacktrace. Kemungkinan besar Anda akan menggunakan flag pengoptimalan menurut saya. Periksa tautan ini - sesuatu yang terkait.

Coba kompilasi dengan -g3menghapus flag optimasi apapun. Maka itu mungkin berhasil. HTH!

kumar_m_kiran
sumber
1
Ah, jadi meskipun program saya dikompilasi -guntuk memuat info debug, saya saat ini berada dalam bingkai tumpukan, diambil dari salah satu pustaka bersama, yang tampaknya tidak dikompilasi untuk memuat informasi baris. Terima kasih, kumar.
Boris Burkov
104

Perintah 'frame' akan memberi Anda apa yang Anda cari. (Ini dapat disingkat hanya 'f'). Berikut ini contohnya:

(gdb) frame
\#0  zmq::xsub_t::xrecv (this=0x617180, msg_=0x7ffff00008e0) at xsub.cpp:139
139         int rc = fq.recv (msg_);
(gdb)

Tanpa argumen, 'frame' hanya memberi tahu Anda di mana Anda berada (dengan argumen itu mengubah frame). Informasi lebih lanjut tentang perintah frame dapat ditemukan di sini .

pengguna3162307
sumber
21

Ingatlah bahwa gdb adalah perintah yang kuat -mampu untuk instruksi tingkat rendah- sehingga terkait dengan konsep perakitan.

Apa yang Anda cari disebut de instruksi pointer, yaitu:

Register penunjuk instruksi menunjuk ke alamat memori yang selanjutnya akan coba dieksekusi oleh prosesor. Penunjuk instruksi disebut ip dalam mode 16-bit, eip dalam mode 32-bit, dan rip dalam mode 64-bit.

lebih detail di sini

semua register yang tersedia pada eksekusi gdb dapat ditampilkan dengan:

(gdb) info registers

dengan itu Anda dapat menemukan mode mana yang menjalankan program Anda (mencari register mana yang ada)

kemudian (di sini menggunakan rip register paling umum saat ini, ganti dengan eip atau sangat jarang ip jika perlu):

(gdb)info line *$rip

akan menunjukkan nomor baris dan sumber file

(gdb) list *$rip

akan menunjukkan baris itu dengan beberapa sebelum dan sesudah

tapi mungkin

(gdb) frame

seharusnya cukup dalam banyak kasus.

albfan.dll
sumber
2
GDB tidak mendukung mode 16-bit, saya yakin, jadi iptidak pernah digunakan di sini. Juga, bukan secara eksplisit ejaan nama program counter, Anda dapat menggunakan alias GDB untuk itu: $pc. Jadi x/10i $pcakan membongkar 10 instruksi pada penunjuk instruksi saat ini terlepas dari arsitekturnya - ini akan bekerja pada i386, x86_64, ARM dll.
Ruslan
19

Perintah di mana atau bingkai dapat digunakan. dimana perintah akan memberikan lebih banyak info dengan nama fungsi

pravu hal
sumber
2

Semua jawaban di atas benar, Yang saya sukai adalah menggunakan mode tui (ctrl + XA) yang menunjukkan lokasi Anda dan fungsi di jendela terpisah yang sangat membantu pengguna. Semoga itu bisa membantu juga.

Mazhar MIK
sumber