Как печатать значения регистров в GDB? - программирование

Как печатать значения регистров в GDB?

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

(gdb) p $eax
$1 = void
4b9b3361

Ответ 1

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

Ответ 2

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

info registers eip

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

info registers rip

Эти сокращения можно сокращать до:

i r rip

Ответ 3

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

info all-registers

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

Ответ 4

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

Ответ 5

Команды 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).

Советы

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

Ответ 6

Как и в случае GDB 7.7.1, команда, которую вы пробовали, работает:

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

Из документы:

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

и:

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

Но до сих пор мне не повезло с контрольными реестрами: 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