GDB'de kayıt değerleri nasıl yazdırılır?


Yanıtlar:


232

info registerstüm kayıtları gösterir; info registers eaxsadece kaydı gösterir eax. Komut şu şekilde kısaltılabiliri r


Anlıyorum: Geçersiz kayıt `% eax 'Ve eğer sadece" bilgi kayıtları "yaparsam eax görünmüyor. Yine de bir EXC_BAD_ACCESS sinyal talimat ile oluşturulan IDE kod derleme bakıyorum: test% eax,% eax Bu XCode gdb çalışan. GDB neden eax kaydını bildirmiyor?
NoahR

1
Aynı sorun:% eax kodda, ancak yazdırma $ eax geçersiz olduğunu gösterir.
Ruslan Yushchenko

5
Bridgette'nin cevabı benim için çalışıyor. geekosaur'un cevabı çoğunlukla doğrudur, ancak% işaretini atlamanız gerekir, bu nedenle belirli bir kayıt için komut info registers eax. Gerçi bunun farklı gdb sürümleri için farklı olup olmadığından emin değilim.
Kevin

Aynı şeyi lldb için arıyordum, bu yüzden şunu not edeyim: lldb için komutregister read [eax]
holgac

Kodda adım adım ilerlerken kayıt değerlerini sürekli olarak görüntülemek istiyorsanız kullanabilirsiniz display. Örneğin display $eax.
srgsanky

50

GDB'de belirli bir kaydı yazdırmaya çalışıyorsanız,% işaretini atlamanız gerekir. Örneğin,

info registers eip

Yürütülebilir dosya 64 bit ise, kayıtlar r ile başlar. Bunları e ile başlatmak geçerli değildir.

info registers rip

Bunlar kısaltılabilir:

i r rip

37

Ayrıca birde şu var:

info all-registers

Daha sonra ilgilendiğiniz kayıt adını alabilirsiniz - platforma özgü kayıtları bulmak için çok yararlıdır (ARM'de NEON Q ... gibi).


3
Bu var olduğunu bilmediğim kayıtlar hakkında öğretildi :-)
Ciro Santilli 郝海东 病 病 六四 事件 法轮功

1
Benim makinede bu baskılar eax, ecxve diğer standart kayıtlar tarafından gizlenmiş info registers. Bu muhtemelen kabul edilen cevap olmalıdır.
EntangledLoops

15
  • Sadece bir kez kontrol etmek istiyorsanız, info registerskayıtları göster.
  • Örneğin, yalnızca bir kaydı izlemek istiyorsanız display $esp, gdb komut satırında esp kayıtlarını görüntülemeye devam edin.
  • İsterseniz tüm kayıtları izleyin layout regs, TUI modu ile kayıtları göstermeye devam edin.

12

GDB komutları :

  • i r <register_name>: tek bir kayıt yazdırın, ör i r rax.i r eax
  • i r <register_name_1> <register_name_2> ...: birden çok kayıt yazdırın, ör i r rdi rsi.
  • i r: kayan nokta ve vektör kaydı (xmm, ymm, zmm) hariç tüm kayıtları yazdırın.
  • i r a: tüm kayıtları yazdır, kayan nokta ve vektör kaydını dahil et (xmm, ymm, zmm).
  • i r f: tüm FPU kayan kayıtlarını ( st0-7ve birkaçını f*) yazdırın

a( all) Ve f( float) dışındaki diğer kayıt grupları şununla bulunabilir:

maint print reggroups

belgelendiği gibi: https://sourceware.org/gdb/current/onlinedocs/gdb/Registers.html#Registers

İpuçları :

  • xmm0~ xmm15, 128 bit, hemen hemen her modern makine var, 1999 yılında piyasaya sürüldü.
  • ymm0~ ymm15, 256 bit, yeni makine genellikle var, 2011 yılında piyasaya sürüldü.
  • zmm0~ zmm31, 512 bit, normal pc muhtemelen yok ( 2016 yılı olarak ), 2013 yılında piyasaya sürüldü ve çoğunlukla şu ana kadar sunucularda kullanılıyor.
  • Sadece bir xmm / ymm / zmm dizisi gösterilecektir, çünkü bunlar farklı modda aynı kayıtlardır. Makinemde ymm gösterilir.

6

p $eax GDB 7.7.1 itibariyle çalışır

GDB 7.7.1'den itibaren denediğiniz komut çalışır:

set $eax = 0
p $eax
# $1 = 0
set $eax = 1
p $eax
# $2 = 1

Bu sözdizimi, örneğin kayan nokta veya tamsayı olabilen ARM kayan nokta kayıtları için farklı birleşim üyeleri arasında seçim yapmak için de kullanılabilir:

p $s0.f
p $s0.u

Gönderen docs :

Önceden tanımlanmış makineye özgü kayıt adlarından biri olmadıkça, '$' ile başlayan herhangi bir ad, kolaylık değişkeni için kullanılabilir.

ve :

Makine kaydı içeriklerine, ifadelerde '$' ile başlayan isimleri olan değişkenler olarak başvurabilirsiniz. Kayıtların adları her makine için farklıdır; makinenizde kullanılan adları görmek için bilgi kayıtlarını kullanın.

Ancak şimdiye kadar kontrol kayıtları konusunda fazla şansım olmadı: OSDev 2012 http://f.osdev.org/viewtopic.php?f=1&t=25968 || 2005 özellik isteği https://www.sourceware.org/ml/gdb/2005-03/msg00158.html || alt.lang.asm 2013 https://groups.google.com/forum/#!topic/alt.lang.asm/JC7YS3Wu31I

ARM kayan nokta kayıtları

Bkz. Https://reverseengineering.stackexchange.com/questions/8992/floating-point-registers-on-arm/20623#20623


2
Kayıtları bu $sözdizimiyle ifadelerde kullanmak harika .
remcycles
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.