Bagaimana cara mencetak nilai register di GDB?

191

Bagaimana cara mencetak nilai %eaxdan %ebp?

(gdb) p $eax
$1 = void
Assem
sumber
8
Gunakan layout regagar gdb memperlihatkan tabel semua register integer dan flag, dengan menyoroti yang diubah oleh instruksi sebelumnya. Lihat stackoverflow.com/tags/x86/info misalnya.
Peter Cordes

Jawaban:

231

info registersmemperlihatkan semua register; info registers eaxhanya menunjukkan register eax. Perintah dapat disingkati r

geekosaurus
sumber
Saya mendapatkan: Registrasi `% eax 'tidak valid Dan jika saya hanya melakukan" info register "eax tidak muncul. Namun saya melihat perakitan kode saya di IDE di mana sinyal EXC_BAD_ACCESS telah dihasilkan dengan instruksi: test% eax,% eax Ini di XCode menjalankan gdb. Mengapa gdb tidak melaporkan register eax?
NoahR
1
Masalah yang sama:% eax ada dalam kode, namun cetak $ eax menunjukkan batal.
Ruslan Yushchenko
5
Jawaban Bridgette cocok untuk saya. Jawaban geekosaur sebagian besar benar, tetapi Anda perlu menghilangkan tanda%, sehingga perintah untuk register tertentu adalah info registers eax. Saya tidak yakin apakah ini berbeda untuk versi gdb yang berbeda.
Kevin
Saya mencari hal yang sama untuk lldb, jadi izinkan saya hanya mencatat bahwa: untuk lldb, perintahnya adalahregister read [eax]
holgac
Jika Anda ingin menampilkan nilai register secara terus menerus saat Anda melangkah melalui kode yang dapat Anda gunakan display. Untuk misalnya display $eax.
srgsanky
50

Jika Anda mencoba mencetak register tertentu di GDB, Anda harus menghilangkan tanda%. Sebagai contoh,

info registers eip

Jika executable Anda adalah 64 bit, register mulai dengan r. Memulainya dengan e tidak valid.

info registers rip

Itu bisa disingkat menjadi:

i r rip
Bridgette
sumber
37

Ada juga:

info all-registers

Kemudian Anda bisa mendapatkan nama register yang Anda minati - sangat berguna untuk menemukan register spesifik platform (seperti NEON Q ... di ARM).

ya Tidak
sumber
3
Ini diajarkan tentang register yang saya tidak tahu ada :-)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
Pada komputer saya, cetakan ini eax, ecxdan register standar lainnya disembunyikan oleh info registers. Ini mungkin jawaban yang diterima.
EntangledLoops
15
  • Jika hanya ingin memeriksanya sekali, info registersperlihatkan register.
  • Jika hanya ingin menonton satu register, misalnya, display $esplanjutkan tampilan register esp di baris perintah gdb.
  • Jika ingin menonton semua register, layout regslanjutkan tampilkan register, dengan mode TUI.
liuyang1
sumber
12

Perintah Gdb :

  • i r <register_name>: cetak satu register, misalnya i r rax,i r eax
  • i r <register_name_1> <register_name_2> ...: cetak beberapa register, misalnya i r rdi rsi,
  • i r: cetak semua register kecuali register titik mengambang & vektor (xmm, ymm, zmm).
  • i r a: cetak semua register, sertakan floating point & vector register (xmm, ymm, zmm).
  • i r f: cetak semua register mengambang FPU ( st0-7dan beberapa lainnya f*)

Grup register lain selain a( all) dan f( float) dapat ditemukan dengan:

maint print reggroups

sebagaimana didokumentasikan di: https://sourceware.org/gdb/current/onlinedocs/gdb/Registers.html#Registers

Kiat :

  • xmm0~ xmm15, 128 bit, hampir setiap mesin modern memilikinya, dirilis pada tahun 1999.
  • ymm0~ ymm15, 256 bit, mesin baru biasanya memilikinya, mereka dirilis pada 2011.
  • zmm0~ zmm31, adalah 512 bit, pc normal mungkin tidak memilikinya ( seperti tahun 2016 ), mereka dirilis pada 2013, dan terutama digunakan di server sejauh ini.
  • Hanya satu seri xmm / ymm / zmm yang akan ditampilkan, karena mereka adalah register yang sama dalam mode yang berbeda. Di mesin saya, ymm ditampilkan.
Eric Wang
sumber
6

p $eax bekerja pada GDB 7.7.1

Pada GDB 7.7.1, perintah yang Anda coba berfungsi:

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

Sintaks ini juga dapat digunakan untuk memilih antara anggota serikat yang berbeda misalnya untuk register titik mengambang ARM yang dapat berupa titik mengambang atau bilangan bulat:

p $s0.f
p $s0.u

Dari dokumen :

Nama apa pun yang didahului oleh '$' dapat digunakan untuk variabel kenyamanan, kecuali itu adalah salah satu nama register khusus mesin yang telah ditentukan.

dan :

Anda bisa merujuk ke konten register mesin, dalam ekspresi, sebagai variabel dengan nama yang dimulai dengan '$'. Nama register berbeda untuk setiap mesin; gunakan register info untuk melihat nama yang digunakan pada mesin Anda.

Tapi sejauh ini saya belum beruntung dengan register kontrol: OSDev 2012 http://f.osdev.org/viewtopic.php?f=1&t=25968 || Permintaan fitur 2005 https://www.sourceware.org/ml/gdb/2005-03/msg00158.html || alt.lang.asm 2013 https://groups.google.com/forum/#!topic/alt.lang.asm/JC7YS3Wu31I

Register floating point ARM

Lihat: /reverseengineering/8992/floating-point-registers-on-arm/20623#20623

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
2
Sangat bagus untuk dapat menggunakan register dalam ekspresi dengan ini $ sintaks .
remubber