首页 文章

如何在GDB中打印寄存器值?

提问于
浏览
150

如何打印 %eax%ebp 的值?

(gdb) p $eax
$1 = void

6 回答

  • 9

    info registers 显示所有寄存器; info registers eax 只显示寄存器 eax . 该命令可以缩写为 i r

  • 174

    p $eax works as of GDB 7.7.1

    从GDB 7.7.1开始,您尝试过的命令有效:

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

    该语法还可用于在不同的联合成员之间进行选择,例如对于ARM浮点寄存器,可以是浮点数或整数:

    p $s0.f
    p $s0.u
    

    来自the docs

    任何以'$'开头的名称都可以用作便利变量,除非它是预定义的机器专用寄存器名称之一 .

    and

    您可以将表达式中的机器寄存器内容称为名称以“$”开头的变量 . 每台机器的寄存器名称不同;使用信息寄存器查看您机器上使用的名称 .

    但到目前为止,控制寄存器并没有太多运气:OSDev 2012 http://f.osdev.org/viewtopic.php?f=1&t=25968 || 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

  • 33

    如果您尝试在GDB中打印特定寄存器,则必须省略%符号 . 例如,

    info registers eip
    

    如果您的可执行文件是64位,则寄存器以r开头 . 用e开头是无效的 .

    info registers rip
    

    这些可以缩写为:

    i r rip
    
  • 46
    • 如果只想检查一次, info registers 显示寄存器 .

    • 如果只想看一个寄存器,例如, display $esp 继续在gdb命令行中显示esp寄存器 .

    • 如果要监视所有寄存器, layout regs 继续显示寄存器,使用TUI模式 .

  • 8

    Gdb commands

    • i r <register_name> :打印一个寄存器,例如 i r raxi r eax

    • i r <register_name_1> <register_name_2> ... :打印多个寄存器,例如 i r rdi rsi

    • i r :打印除浮点和向量寄存器(xmm,ymm,zmm)之外的所有寄存器 .

    • i r a :打印所有寄存器,包括浮点和向量寄存器(xmm,ymm,zmm) .

    • i r f :打印所有FPU浮动寄存器( st0-7 和其他一些 f*

    除了 aall )和 ffloat )之外的其他寄存器组可以找到:

    maint print reggroups
    

    记录于:https://sourceware.org/gdb/current/onlinedocs/gdb/Registers.html#Registers

    Tips

    • xmm0 ~ xmm15 ,是128位,几乎每台现代机器都有它,它们于1999年发布 .

    • ymm0 ~ ymm15 ,是256位,新机器通常都有它,它们是在2011年发布的 .

    • zmm0 ~ zmm31 ,是512位,普通PC可能没有它(如2016年),它们是2013年发布的,主要用于服务器到目前为止 .

    • 仅显示一个xmm / ymm / zmm的序列,因为它们在不同模式下是相同的寄存器 . 在我的机器上显示ymm .

  • 2

    还有:

    info all-registers
    

    然后,您可以获得您感兴趣的寄存器名称 - 对于查找特定于平台的寄存器(如ARM上的NEON Q ...)非常有用 .

相关问题