Jak wydrukować wartości rejestru w GDB?

191

Jak wydrukować wartość %eaxi %ebp?

(gdb) p $eax
$1 = void
assem
źródło
8
Użyj, layout regaby gdb wyświetlał tabelę wszystkich rejestrów liczb całkowitych i flag, podświetlając te zmienione przez poprzednią instrukcję. Zobacz na przykład stackoverflow.com/tags/x86/info .
Peter Cordes,

Odpowiedzi:

232

info registerspokazuje wszystkie rejestry; info registers eaxpokazuje tylko rejestr eax. Polecenie może być skrócone jakoi r

geekozaur
źródło
Dostaję: Niepoprawny rejestr `% eax 'A jeśli tylko zrobię" info registerors "eax się nie pojawi. Jednak patrzę na mój zestaw kodu w IDE, w którym wygenerowano sygnał EXC_BAD_ACCESS z instrukcją: test% eax,% eax To jest w XCode z uruchomionym gdb. Dlaczego gdb nie zgłasza rejestru eax?
NoahR,
1
Ten sam problem:% eax jest w kodzie, ale print $ eax pokazuje nieważność.
Ruslan Juszczenko
5
Odpowiedź Bridgette działa dla mnie. odpowiedź geekozaura jest w większości prawidłowa, ale musisz pominąć znak%, więc polecenie dla określonego rejestru brzmi info registers eax. Nie jestem jednak pewien, czy jest inaczej w różnych wersjach gdb.
Kevin,
Szukałem tego samego dla lldb, więc zaznaczę, że: dla lldb polecenie brzmiregister read [eax]
holgac
Jeśli chcesz wyświetlać wartości rejestru w sposób ciągły, przechodząc przez kod, którego możesz użyć display. Dla np display $eax.
srgsanky
50

Jeśli próbujesz wydrukować konkretny rejestr w GDB, musisz pominąć znak%. Na przykład,

info registers eip

Jeśli plik wykonywalny ma format 64-bitowy, rejestry rozpoczynają się od r. Rozpoczęcie ich od e jest nieprawidłowe.

info registers rip

Można je skrócić do:

i r rip
Bridgette
źródło
37

Jest również:

info all-registers

Następnie możesz uzyskać nazwę rejestru, który Cię interesuje - bardzo przydatny do znajdowania rejestrów specyficznych dla platformy (np. NEON Q ... na ARM).

Yano
źródło
3
Nauczono o rejestrach, o których istnieniu nie wiedziałem :-)
Ciro Santilli 9 冠状 病 六四 事件 法轮功
1
Na moim komputerze, to drukuje eax, ecxoraz inne standardowe rejestry ukryte info registers. To prawdopodobnie powinna być zaakceptowana odpowiedź.
EntangledLoops,
15
  • Jeśli chcesz to sprawdzić tylko raz, info registerspokaż rejestry.
  • Jeśli chcesz na przykład obejrzeć tylko jeden rejestr, display $espkontynuuj wyświetlanie rejestrów esp w wierszu poleceń gdb.
  • Jeśli chcesz oglądać wszystkie rejestry, layout regskontynuuj pokazywanie rejestrów w trybie TUI.
liuyang1
źródło
12

Komendy Gdb :

  • i r <register_name>: Wydrukować jeden rejestr, na przykład i r rax,i r eax
  • i r <register_name_1> <register_name_2> ...: Wydrukować wiele rejestrów, np i r rdi rsi,
  • i r: wydrukuj cały rejestr oprócz rejestru zmiennoprzecinkowego i wektorowego (xmm, ymm, zmm).
  • i r a: wydrukuj cały rejestr, w tym rejestr zmiennoprzecinkowy i wektorowy (xmm, ymm, zmm).
  • i r f: wydrukuj wszystkie rejestry zmiennoprzecinkowe FPU ( st0-7i kilka innych f*)

Inne grupy rejestrów oprócz a( all) i f( float) można znaleźć za pomocą:

maint print reggroups

zgodnie z dokumentacją na stronie : https://sourceware.org/gdb/current/onlinedocs/gdb/Registers.html#Registers

Wskazówki :

  • xmm0~ xmm15, mają 128 bitów, prawie każda nowoczesna maszyna ma to, są wydane w 1999 roku.
  • ymm0~ ymm15, mają 256 bitów, zwykle mają to nowe maszyny, zostały wydane w 2011 roku.
  • zmm0~ zmm31, mają 512 bitów, normalny komputer prawdopodobnie ich nie ma ( jak w 2016 roku ), są wydane w 2013 roku i do tej pory były używane głównie na serwerach.
  • Wyświetlany będzie tylko jeden szereg xmm / ymm / zmm, ponieważ są to te same rejestry w innym trybie. Na mojej maszynie pokazane jest ymm.
Eric Wang
źródło
6

p $eax działa od GDB 7.7.1

Począwszy od GDB 7.7.1, wypróbowane polecenie działa:

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

Tej składni można również użyć do wyboru między różnymi elementami unii, np. Dla rejestrów zmiennoprzecinkowych ARM, które mogą być zmiennoprzecinkowe lub liczb całkowitych:

p $s0.f
p $s0.u

Z dokumentów :

Dowolna nazwa poprzedzona „$” może być użyta jako zmienna wygody, chyba że jest to jedna z predefiniowanych nazw rejestrów specyficznych dla maszyny.

i :

Do wyrażeń można odwoływać się do zawartości rejestru maszynowego jako zmiennych o nazwach rozpoczynających się od „$”. Nazwy rejestrów są różne dla każdej maszyny; użyj rejestrów informacyjnych, aby zobaczyć nazwy używane na twoim komputerze.

Ale dotychczas nie miałem dużo szczęścia z rejestrami kontrolnymi: OSDev 2012 http://f.osdev.org/viewtopic.php?f=1&t=25968 || Żądanie funkcji w 2005 r. Https://www.sourceware.org/ml/gdb/2005-03/msg00158.html || alt.lang.asm 2013 https://groups.google.com/forum/#!topic/alt.lang.asm/JC7YS3Wu31I

Rejestry zmiennoprzecinkowe ARM

Zobacz: /reverseengineering/8992/floating-point-registers-on-arm/20623#20623

Ciro Santilli
źródło
2
Wspaniale jest móc korzystać z rejestrów w wyrażeniach z tą $składnią.
remultuje