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

191

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

(gdb) p $eax
$1 = void
Асем
источник
8
Используйте, layout regчтобы gdb показывал таблицу всех регистров целых чисел и флагов, выделяя те, которые были изменены предыдущей инструкцией. См. Например, stackoverflow.com/tags/x86/info .
Питер Кордес

Ответы:

232

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

geekosaur
источник
Я получаю: Неверный регистр `% eax 'И если я просто делаю" информационные регистры ", eax не появляется. Тем не менее, я смотрю на мою сборку кода в IDE, где сгенерирован сигнал EXC_BAD_ACCESS с инструкцией: test% eax,% eax Это в XCode, где выполняется gdb. Почему GDB не сообщает eax регистр?
NoahR
1
Та же проблема:% eax в коде, но print $ eax показывает void.
Руслан Ющенко
5
Ответ Бриджитт работает для меня. Ответ geekosaur в основном правильный, но вы должны опустить знак%, поэтому команда для определенного регистра - info registers eax. Я не уверен, если это отличается для разных версий GDB, хотя.
Кевин
Я искал то же самое для lldb, поэтому позвольте мне отметить, что для lldb командаregister read [eax]
holgac
Если вы хотите непрерывно отображать значения регистров во время пошагового выполнения кода, который вы можете использовать display. Для например display $eax.
srgsanky
50

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

info registers eip

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

info registers rip

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

i r rip
Бриджитт
источник
37

А также есть:

info all-registers

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

Яно
источник
3
Это учило быть о регистрах, которые я не знал, существуют :-)
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
1
На моей машине, это печатает eax, ecxи другие стандартные регистры скрыты info registers. Вероятно, это должен быть принятый ответ.
EntangledLoops
15
  • Если хотите только один раз проверить, info registersпокажите регистры.
  • Например, если вы хотите просмотреть только один регистр, display $espпродолжайте отображать регистры esp в командной строке GDB.
  • Если хотите посмотреть все регистры, layout regsпродолжайте показывать регистры в режиме TUI.
liuyang1
источник
12

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~ xmm15128 бит, почти каждая современная машина имеет его, они выпущены в 1999 году.
  • ymm0~ ymm15256 бит, новые машины обычно есть, они выпущены в 2011 году.
  • zmm0~ zmm31, 512 бит, нормальный компьютер, вероятно, не имеет ( как 2016 год ), они выпущены в 2013 году и до сих пор используются в основном на серверах.
  • Будет показан только один серийный номер xmm / ymm / zmm, потому что это разные регистры в разных режимах. На моей машине показывается ymm.
Эрик Ван
источник
6

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 регистры с плавающей запятой

См .: /reverseengineering/8992/floating-point-registers-on-arm/20623#20623.

Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
источник
2
Здорово иметь возможность использовать регистры в выражениях с этим $синтаксисом.
Ремициклы