How do I print the value of %eax
and %ebp
?
(gdb) p $eax
$1 = void
This question is related to
gdb
cpu-registers
p $eax
works as of GDB 7.7.1
As of GDB 7.7.1, the command you've tried works:
set $eax = 0
p $eax
# $1 = 0
set $eax = 1
p $eax
# $2 = 1
This syntax can also be used to select between different union members e.g. for ARM floating point registers that can be either floating point or integers:
p $s0.f
p $s0.u
From the docs:
Any name preceded by ‘$’ can be used for a convenience variable, unless it is one of the predefined machine-specific register names.
and:
You can refer to machine register contents, in expressions, as variables with names starting with ‘$’. The names of registers are different for each machine; use info registers to see the names used on your machine.
But I haven't had much luck with control registers so far: OSDev 2012 http://f.osdev.org/viewtopic.php?f=1&t=25968 || 2005 feature request 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 floating point registers
Gdb commands:
i r <register_name>
: print a single register, e.g i r rax
, i r eax
i r <register_name_1> <register_name_2> ...
: print multiple registers, e.g i r rdi rsi
,i r
: print all register except floating point & vector register (xmm, ymm, zmm).i r a
: print all register, include floating point & vector register (xmm, ymm, zmm).i r f
: print all FPU floating registers (st0-7
and a few other f*
) Other register groups besides a
(all
) and f
(float
) can be found with:
maint print reggroups
as documented at: https://sourceware.org/gdb/current/onlinedocs/gdb/Registers.html#Registers
Tips:
xmm0
~ xmm15
, are 128 bits, almost every modern machine has it, they are released in 1999.ymm0
~ ymm15
, are 256 bits, new machine usually have it, they are released in 2011.zmm0
~ zmm31
, are 512 bits, normal pc probably don't have it (as the year 2016), they are released in 2013, and mainly used in servers so far.If you're trying to print a specific register in GDB, you have to omit the % sign. For example,
info registers eip
If your executable is 64 bit, the registers start with r. Starting them with e is not valid.
info registers rip
Those can be abbreviated to:
i r rip
There is also:
info all-registers
Then you can get the register name you are interested in -- very useful for finding platform-specific registers (like NEON Q... on ARM).
info registers
show registers.display $esp
continue display esp registers in gdb command line.layout regs
continue show registers, with TUI mode.Source: Stackoverflow.com