2011-03-25 172 views
124

如何打印的%eax%ebp價值?如何在GDB中打印寄存器值?

(gdb) p $eax 
$1 = void 
+2

使用'佈局reg'具有GDB顯示所有整數和標誌寄存器的一個表,突出由前一指令改變所述一個(多個)。例如,請參閱http://stackoverflow.com/tags/x86/info。 – 2015-07-25 20:08:52

回答

149

info registers顯示所有寄存器; info registers eax卻與此註冊eax。該命令可以。如果你想打印GDB一個特定的寄存器縮寫爲i r

+0

我得到:無效的寄存器'%eax中」 如果我只是做‘信息登記’EAX不出來。然而,我期待在IDE我的代碼組件,其中一個EXC_BAD_ACCESS信號已與指令生成的:測試%EAX,EAX% 這是XCode中運行GDB。 gdb爲什麼不報告eax寄存器? – NoahR 2011-10-20 18:45:00

+1

同樣的問題:%eax在代碼中,但是print $ eax顯示void。 – 2012-10-08 16:42:33

+4

Bridgette的答案適合我。 geekosaur的答案大部分都是正確的,但是你需要省略%符號,所以特定寄存器的命令是'info registers eax'。不過,我不確定這是不同版本的gdb。 – Kevin 2012-10-10 03:59:10

37

,你必須忽略%的跡象。例如,

info registers eip 

如果你的可執行文件是64位寄存器開始與河用e開始它們是無效的。

info registers rip 

那些可以縮寫爲:

i r rip 
30

還有:

info all-registers 

然後你就可以得到註冊名,你有興趣 - 尋找非常有用的平臺 - 特定的寄存器(如ARM上的NEON Q ...)。

+3

這個教導是關於我不知道存在的寄存器:-) – 2015-05-09 09:29:52

+1

在我的機器上,這將打印'info寄存器'隱藏的'eax','ecx'和其他標準寄存器。這應該可以被接受的答案。 – EntangledLoops 2016-12-20 16:51:26

1

由於GDB 7.7.1,命令你試過作品:

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

the docs

通過 '$' 開頭的任何名稱可用於慣用變量,除非它是預定義的特定於計算機的寄存器名稱之一。

and

你可以參考機器的寄存器內容,表現形式,如以「$」名稱的變量。每臺機器的寄存器名稱不同;使用信息寄存器來查看您的機器上使用的名稱。

但我還沒有與控制寄存器的運氣至今: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

7
  • 如果只想檢查一次,info registers顯示寄存器。
  • 如果僅希望觀看一個寄存器,例如,display $esp繼續在gdb命令行顯示ESP寄存器。
  • 如果想觀看所有的寄存器,layout regs繼續顯示寄存器,以TUI模式。
5

GDB命令

  • i r <register_name>:打印單個寄存器,例如克i r raxi r eax
  • i r <register_name_1> <register_name_2> ...:打印多個寄存器,e.g i r rdi rsi
  • i r:打印所有寄存器除了浮點&矢量寄存器(XMM,YMM,ZMM)。

  • i r a:打印所有寄存器,包含浮點數&矢量寄存器(xmm,ymm,zmm)。

提示

  • xmm0xmm15,爲128位,幾乎每一個現代化的機器,他們是在1999年
  • ymm0ymm15發佈,是256位,新機通常有它,他們被釋放在2011年
  • zmm0zmm31,有512位,正常的電腦可能沒有它(爲2016年),他們被釋放在2013年,主要用於在服務器爲止。
  • 只有XMM/YMM /個zmm的一個串行將被示出,因爲它們是在不同的模式中是相同的寄存器。在我的機器上顯示ymm。