Як надрукувати значення регістрів у 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


Я отримую: Недійсний регістр `% eax 'І якщо я просто роблю" інформаційні регістри ", eax не відображається. Але я дивлюся на свою збірку коду в IDE, де згенеровано сигнал EXC_BAD_ACCESS з інструкцією: test% eax,% eax Це в XCode, який працює gdb. Чому gdb не повідомляє реєстр eax?
NoahR

1
Ця ж проблема:% eax знаходиться в коді, але друк $ eax показує недійсність.
Руслан Ющенко

5
Відповідь Бріджит працює на мене. Відповідь geekosaur здебільшого вірна, але вам потрібно опустити знак%, тому команда для конкретного регістра є info registers eax. Я не впевнений, чи це по-різному для різних версій gdb.
Кевін

Я шукав те саме, що і для lldb, тому дозвольте мені лише зазначити, що для lldb командаregister read [eax]
holgac

Якщо ви хочете постійно відображати регістрові значення, переглядаючи код, який ви можете використовувати display. Наприклад, наприклад display $eax.
srgsanky

50

Якщо ви намагаєтеся надрукувати певний реєстр в GDB, вам потрібно опустити знак%. Наприклад,

info registers eip

Якщо ваш виконуваний файл має 64 біт, регістри починаються з r. Починати їх з e не вірно.

info registers rip

Їх можна скоротити до:

i r rip

37

Є також:

info all-registers

Тоді ви можете отримати ім'я реєстру, яке вас цікавить - дуже корисно для пошуку конкретних платформних регістрів (як NEON Q ... на ARM).


3
Це вчили про регістри, яких я не знав, що існують :-)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1
На моїй машині, це друкує eax, ecxі інші стандартні регістри приховані info registers. Це, мабуть, має бути прийнятою відповіддю.
EntangledLoops

15
  • Якщо ви хочете перевірити це лише один раз, info registersпокажіть регістри.
  • Якщо ви хочете переглянути лише один реєстр, наприклад, display $espпродовжуйте відображати регістри esp у командному рядку gdb.
  • Якщо ви хочете переглянути всі регістри, layout regsпродовжуйте показувати регістри в режимі TUI.

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~ xmm15, мають 128 біт, майже кожна сучасна машина має її, вони випущені в 1999 році.
  • ymm0~ ymm15, - це 256 біт, нові машини зазвичай мають його, вони випущені в 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
Чудово мати можливість використовувати регістри у виразах із цим $синтаксисом.
рецикл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.