[英]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.