[英]Show what's current value of registers. (AArch64 Android assembly debugging)
我想看看我的程序中所有寄存器內部發生了什么。
我有這段代碼在 AArch64 Linux 上作為靜態可執行文件運行良好。
.data
msg:
.ascii "Hello World\n"
len = . - msg
.text
.globl _start
_start:
mov x0, #0x1
ldr x1, =msg
ldr x2, =len
mov x8, #0x40
svc #0x0
mov x0, #0x0
mov x8, #0x5d
svc #0x0
並使用此命令編譯並運行它(在 Android 上的 Termux 中)。
as hello.s -o hello.o
ld hello.o -o hello
./hello
與 8086 處理器應用程序 (emu8086) 的仿真不同,我可以一步一步地看到 CPU 如何在該仿真器內部獲取、解碼和執行,以及當前寄存器值以及當前內存值及其地址。
在這個真正的程序集(不是仿真)中,我什至看不到地址中的內存值是什么。
我正在考慮使用gdb
。 但我認為我需要示例如何使用它。
至少我想看看:
到目前為止,我正在修補gdb
在這里我學到了什么
假設程序仍然和我的帖子一樣。
只需簡單地開始調試
gdb ./hello
然后它會顯示gdb解釋器
b _start
它將添加斷點 1 然后如果需要再次添加
b *_start+4
它將添加斷點 2 等等,直到程序結束。
只需簡單地運行程序
run
它將運行斷點 1
好的,現在只是簡單地顯示當前內存值
x /5i _start
它將以指令格式顯示 _start 的前 5 個內存值。
0x4000b0 <_start>:
mov x0, #0x1 // #1
=> 0x4000b4 <_start+4>: ldr x1, 0x4000d0 <_start+32>
0x4000b8 <_start+8>: ldr x2, 0x4000d8 <_start+40>
0x4000bc <_start+12>:
mov x8, #0x40 // #64
0x4000c0 <_start+16>: svc #0x0
=>
標記表示當前斷點
要顯示當前寄存器,只需鍵入
i r
然后鍵入n
執行下一個斷點。
好的,到目前為止,usig gdb 的負擔已經足夠了,我希望有一種最簡單的方法可以通過步驟 +4 將斷點從特定地址添加到結束地址。
另外我仍然沒有弄清楚如何查看標志寄存器。
我仍然期待gdb
在一個顯示/屏幕中顯示當前寄存器值、當前內存值和當前標志寄存器值。 並且當我下一個斷點時,屏幕將自動更新,而且我希望它會從 _start、_start+4 等添加斷點.. 無需像上面那樣手動添加
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.