Come stampare i valori di registro in GDB?


191

Come stampo il valore di %eaxe %ebp?

(gdb) p $eax
$1 = void

8
Utilizzare layout regper fare in modo che gdb mostri una tabella di tutti i registri di numeri interi e flag, evidenziando quelli modificati dall'istruzione precedente. Vedi stackoverflow.com/tags/x86/info per esempio.
Peter Cordes,

Risposte:


232

info registersmostra tutti i registri; info registers eaxmostra solo il registro eax. Il comando può essere abbreviato comei r


Ottengo: registro non valido `% eax 'E se faccio semplicemente" info registri "eax non compare. Eppure sto guardando il mio assembly di codice nell'IDE in cui un segnale EXC_BAD_ACCESS è stato generato con l'istruzione: test% eax,% eax Questo è in XCode che esegue gdb. Perché gdb non sta segnalando il registro eax?
NoahR

1
Stesso problema:% eax è nel codice, ma stampa $ eax mostra nulla.
Ruslan Yushchenko,

5
La risposta di Bridgette funziona per me. La risposta di geekosaur è per lo più corretta, ma è necessario omettere il segno%, quindi il comando per un registro specifico è info registers eax. Non sono sicuro se questo sia diverso per le diverse versioni di gdb, però.
Kevin,

Stavo cercando la stessa cosa per lldb, quindi fammi solo notare che: per lldb, il comando èregister read [eax]
holgac,

Se si desidera visualizzare continuamente i valori del registro mentre si scorre il codice, è possibile utilizzare display. Per es display $eax.
srgsanky,

50

Se stai provando a stampare un registro specifico in GDB, devi omettere il segno%. Per esempio,

info registers eip

Se il tuo eseguibile è a 64 bit, i registri iniziano con r. Iniziarli con e non è valido.

info registers rip

Questi possono essere abbreviati in:

i r rip

37

C'è anche:

info all-registers

Quindi puoi ottenere il nome del registro che ti interessa - molto utile per trovare registri specifici della piattaforma (come NEON Q ... su ARM).


3
Questo ha insegnato su registri che non sapevo esistessero :-)
Ciro Santilli 9 冠状 病 六四 事件 法轮功

1
Sulla mia macchina, questo stampe eax, ecxe altri registri standard, nascosti da info registers. Questa dovrebbe probabilmente essere la risposta accettata.
EntangledLoops,

15
  • Se vuoi controllarlo solo una volta, info registers mostra i registri.
  • Se vuoi solo guardare un registro, ad esempio, display $esp continua a visualizzare i registri esp nella riga di comando gdb.
  • Se vuoi guardare tutti i registri, layout regscontinua a mostrare i registri, con la modalità TUI.

12

Comandi Gdb :

  • i r <register_name>: stampa un unico registro, ad es i r rax.i r eax
  • i r <register_name_1> <register_name_2> ...: stampa più registri, ad es i r rdi rsi.
  • i r: stampa tutti i registri tranne il virgola mobile e il registro vettoriale (xmm, ymm, zmm).
  • i r a: stampa tutto il registro, include il virgola mobile e il registro vettoriale (xmm, ymm, zmm).
  • i r f: stampa tutti i registri mobili FPU ( st0-7e pochi altri f*)

Altri gruppi di registri oltre a a( all) e f( float) sono disponibili con:

maint print reggroups

come documentato su: https://sourceware.org/gdb/current/onlinedocs/gdb/Registers.html#Registers

Suggerimenti :

  • xmm0~ xmm15, sono 128 bit, quasi tutte le macchine moderne ce l'hanno, sono state rilasciate nel 1999.
  • ymm0~ ymm15, sono 256 bit, di solito la nuova macchina ce l'ha, vengono rilasciati nel 2011.
  • zmm0~ zmm31, sono 512 bit, i pc normali probabilmente non ce l'hanno ( come l'anno 2016 ), sono stati rilasciati nel 2013 e finora utilizzati principalmente nei server.
  • Verrà mostrato solo un seriale di xmm / ymm / zmm, perché sono gli stessi registri in modalità diversa. Sulla mia macchina viene mostrato ymm.

6

p $eax funziona a partire da GDB 7.7.1

A partire da GDB 7.7.1, il comando che hai provato funziona:

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

Questa sintassi può anche essere utilizzata per selezionare tra diversi membri del sindacato, ad esempio per i registri a virgola mobile ARM che possono essere in virgola mobile o interi:

p $s0.f
p $s0.u

Dai documenti :

Qualsiasi nome preceduto da '$' può essere utilizzato per una variabile di convenienza, a meno che non sia uno dei nomi di registro specifici della macchina predefiniti.

e :

È possibile fare riferimento al contenuto del registro macchina, nelle espressioni, come variabili con nomi che iniziano con '$'. I nomi dei registri sono diversi per ogni macchina; utilizzare i registri delle informazioni per visualizzare i nomi utilizzati sulla macchina.

Finora non ho avuto molta fortuna con i registri di controllo: OSDev 2012 http://f.osdev.org/viewtopic.php?f=1&t=25968 || Richiesta di funzionalità 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

Registri a virgola mobile ARM

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


2
È fantastico poter usare i registri nelle espressioni con questa $sintassi.
ricicla il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.