gdb: mevcut satır nasıl yazdırılır veya mevcut satır numarası nasıl bulunur?


97

list komutlar bir dizi satır yazdırıyor, ancak tek bir satıra ihtiyacım var, nerede olduğum ve muhtemelen bir hatanın meydana geldiği yer.


23
backtraceveya where, hatta info lineveya sadece bt(geri izleme için). dirac.org/linux/gdb gdb eğitimi için
dwalter

btveya backtraceveya whereişlev çağrıları yığınını yazdırın fveya frameyürütmek için sonraki satırı yazdırın.
Eric Wang

Yanıtlar:


21

Hata ayıklarken aynı bilgileri alıyorum. Yığın izini kontrol ederken değil. Muhtemelen optimizasyon bayrağını kullanırdınız sanırım. Bu bağlantıyı kontrol edin - ilgili bir şey.

-g3Herhangi bir optimizasyon işaretini kaldırarak derlemeyi deneyin . O zaman işe yarayabilir. HTH!


1
Ah, programım -ghata ayıklama bilgilerini içerecek şekilde derlenmiş olmasına rağmen , şu anda bir yığın çerçevesindeyim, paylaşılan kitaplıklardan birinden alınmış, görünüşe göre satır bilgilerini içerecek şekilde derlenmemiş. Teşekkürler kumar.
Boris Burkov

107

'Çerçeve' komutu aradığınızı size verecektir. (Bu sadece 'f' olarak kısaltılabilir). İşte bir örnek:

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

Bir argüman olmadan, 'çerçeve' sadece nerede olduğunuzu söyler (bir argümanla çerçeveyi değiştirir). Çerçeve komutu hakkında daha fazla bilgi burada bulunabilir .


22

Nerede veya çerçevenin kullanılabileceği komutu . komut, fonksiyon adı ile daha fazla bilgi verecek


21

Gdb'nin düşük seviyeli talimatlara sahip güçlü bir komut olduğunu ve bu nedenle montaj konseptlerine bağlı olduğunu unutmayın.

Aradığınız şeye de talimat gösterici denir, yani:

Komut işaretçisi kaydı, işlemcinin daha sonra yürütmeye çalışacağı bellek adresini gösterir. Yönerge işaretçisi 16 bit modunda ip , 32 bit modunda eip ve 64 bit modunda rip olarak adlandırılır.

burada daha fazla ayrıntı

gdb uygulamasında bulunan tüm kayıtlar şu şekilde gösterilebilir:

(gdb) info registers

bununla programınızın hangi modda çalıştığını bulabilirsiniz (bu kayıtlardan hangilerinin var olduğuna bakın)

sonra (burada günümüzde en yaygın register ripini kullanarak , gerekirse eip veya çok nadiren ip ile değiştirin ):

(gdb)info line *$rip

size satır numarasını ve dosya kaynağını gösterecek

(gdb) list *$rip

size bu çizgiyi öncesi ve sonrası ile gösterecek

ama muhtemelen

(gdb) frame

çoğu durumda yeterli olmalıdır.


2
GDB'nin 16 bit modunu desteklemediğine inanıyorum, bu yüzden ipburada hiç kullanılmıyor. Ayrıca, açıkça program sayacının adlarına yerine, bunun için GDB diğer adını kullanabilirsiniz: $pc. Böylece x/10i $pcmimariden bağımsız olarak mevcut yönerge işaretçisindeki 10 komutu parçalarına ayıracak - i386, x86_64, ARM vb. Üzerinde çalışacak.
Ruslan

4

Yukarıdaki tüm cevaplar doğrudur, tercih ettiğim şey, konumunuzu ve işlevi ayrı bir pencerede gösteren ve kullanıcılar için çok yararlı olan tui modunu (ctrl + XA veya 'tui etkinleştir') kullanmaktır. Umarım bu da yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.