Как напечатать значения регистров в GDB? - PullRequest
167 голосов
/ 25 марта 2011

Как напечатать значения %eax и %ebp?

(gdb) p $eax
$1 = void

Ответы [ 6 ]

199 голосов
/ 25 марта 2011

info registers показывает все регистры; info registers eax показывает только регистр eax. Команда может быть сокращена до i r

47 голосов
/ 04 февраля 2012

Если вы пытаетесь напечатать определенный регистр в GDB, вы должны опустить знак%. Например,

info registers eip

Если ваш исполняемый файл 64-битный, регистры начинаются с r. Недопустимо начинать их с e.

info registers rip

Они могут быть сокращены до:

i r rip
35 голосов
/ 14 августа 2012

Существует также:

info all-registers

Затем вы можете получить интересующее вас имя регистра - очень полезно для поиска регистров, специфичных для платформы (например, NEON Q ... в ARM).*

11 голосов
/ 11 ноября 2015
  • Если хотите проверить только один раз, info registers показать регистры.
  • Если хотите просмотреть только один регистр, например, display $esp продолжить отображение регистров esp в командной строке gdb.
  • Если хотите посмотреть все регистры, layout regs продолжить показ регистров в режиме TUI.
9 голосов
/ 26 июня 2016

Команды Gdb :

  • i r <register_name>: печать одного регистра, например, i r rax, i 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*)

Другой регистргруппы кроме a (all) и f (float) можно найти с:

maint print reggroups

, как указано в: https://sourceware.org/gdb/current/onlinedocs/gdb/Registers.html#Registers

Советы:

  • xmm0 ~ xmm15, 128 бит, почти у каждой современной машины есть, они выпущены в 1999 году.
  • ymm0 ~ ymm15, 256 бит, новая машина обычно имеет их, они выпущены в 2011 году.
  • zmm0 ~ zmm31, 512 бит, нормальный компьютер, вероятно, не имеет ( как2016 год ), они выпущены в 2013 году и используются в основном на серверах.
  • Будет показан только один серийный номер xmm / ymm / zmm, потому что это разные регистры в разных режимах.На моей машине отображается ymm.
4 голосов

p $eax работает с 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

С Документы :

Любое имя, которому предшествует «$», может использоваться для вспомогательной переменной, если только оно не является одним из предварительно определенных машинных имен регистров.

и

Вы можете ссылаться на содержимое регистра машины в выражениях как на переменные с именами, начинающимися с «$». Имена регистров различны для каждой машины; используйте информационные регистры, чтобы увидеть имена, используемые на вашем компьютере.

Но мне пока не повезло с регистрами управления: 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

ARM регистры с плавающей запятой

См .: https://reverseengineering.stackexchange.com/questions/8992/floating-point-registers-on-arm/20623#20623

...