Bagaimana cara mencetak nilai register di GDB?


Jawaban:


231

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


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

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).


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.

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.

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


2
Sangat bagus untuk dapat menggunakan register dalam ekspresi dengan ini $ sintaks .
— remubber
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.