gpt4 book ai didi

assembly - 如何使用 GDB 调试 jonesforth?

转载 作者:行者123 更新时间:2023-12-04 12:50:33 24 4
gpt4 key购买 nike

jonesforth 通常按如下方式启动:

cat jonesforth.f  - | ./jonesforth

什么是调试 jonesforth 的好方法?

最佳答案

在 Ubuntu 上?

如果您使用的是 Ubuntu,请允许 gdb附加到正在运行的进程:

echo 0 > /proc/sys/kernel/yama/ptrace_scope

如果您希望该设置在重新启动后保持不变:

vim /etc/sysctl.d/10-ptrace.conf

更新生成文件

添加 g标记你的 jonesforth Makefile食谱:

jonesforth: jonesforth.S
gcc -g -m32 -nostdlib -static $(BUILD_ID_NONE) -o $@ $<

启动gdb

然后,像往常一样在终端中启动 jonesforth:

cat jonesforth.f - | ./jonesforth

在另一个终端,启动gdb并将其附加到正在运行的 jonesforth:

gdb --quiet --pid=`pgrep jonesforth`  ./jonesforth 

示例 session

这是我开始时看到的 gdb :

$ gdb --quiet --pid=`pgrep jonesforth`  ./jonesforth 
Reading symbols from ./jonesforth...done.
Attaching to program: /home/dharmatech/Dropbox/Documents/jonesforth-annexia/jonesforth, process 3406
_KEY () at jonesforth.S:1290
1290 test %eax,%eax // If %eax <= 0, then exit.
(gdb)

Jonesforth 正在等待我们输入内容。它在 _KEY 中 assembly 程序。这由 gdb 表示以上。它还显示第 1290 行是下一个要执行的行。这是 _KEY常规:

_KEY:
mov (currkey),%ebx
cmp (bufftop),%ebx
jge 1f // exhausted the input buffer?
xor %eax,%eax
mov (%ebx),%al // get next key from input buffer
inc %ebx
mov %ebx,(currkey) // increment currkey
ret

1: // Out of input; use read(2) to fetch more input from stdin.
xor %ebx,%ebx // 1st param: stdin
mov $buffer,%ecx // 2nd param: buffer
mov %ecx,currkey
mov $BUFFER_SIZE,%edx // 3rd param: max length
mov $__NR_read,%eax // syscall: read
int $0x80
test %eax,%eax // If %eax <= 0, then exit.
jbe 2f
addl %eax,%ecx // buffer+%eax = bufftop
mov %ecx,bufftop
jmp _KEY

2: // Error or end of input: exit the program.
xor %ebx,%ebx
mov $__NR_exit,%eax // syscall: exit
int $0x80

_KEY使用内存中的一些变量:buffer , currkey , 和 bufftop .它还使用了几个寄存器。让我们使用 gdbAuto Display显示这些的功能:

display/8cb &buffer
display/1xw &currkey
display/1xw &bufftop
display/x $eax
display/x $ebx

现在如果我们输入 displaygdb ,我们将立即看到所有这些:

(gdb) display
1: x/8cb &buffer
0x804c000: 97 'a' 98 'b' 108 'l' 121 'y' 46 '.' 32 ' ' 32 ' ' 84 'T'
2: x/xw &currkey 0x8049d54: 0x0804c000
3: x/xw &bufftop 0x8049d58: 0x0804c7e3
4: /x $eax = 0xfffffe00
5: /x $ebx = 0x0

这也可能是启用 gdb 的好时机的途易:

tui enable

gdb 现在应该是这样的:

enter image description here

好的,jonesforth 仍在等待输入。所以让我们给它一些东西:

JONESFORTH VERSION 47 
14499 CELLS REMAINING
OK 123

好吧,回到 gdb,我们终于可以要求它执行:

(gdb) s
1: x/8cb &buffer
0x804c000: 49 '1' 50 '2' 51 '3' 10 '\n' 46 '.' 32 ' ' 32 ' ' 84 'T'
2: x/xw &currkey 0x8049d54: 0x0804c000
3: x/xw &bufftop 0x8049d58: 0x0804c7e3
4: /x $eax = 0x4
5: /x $ebx = 0x0

嘿,看那个! buffer 中的前 3 个字符是 1 , 2 , 和 3 .

如果%eax <= 0下一步会跳转到2f标签。但正如我们在上面看到的,%eax4 .所以它应该继续。

如果我们单步执行接下来的三行,bufftop将被设置为 buffer 的地址递增 4(三个字符“123”加上一个换行符)。与地址 buffer 有关的值 checkout :

3: x/xw &bufftop  0x8049d58:    0x0804c004

现在数据已被读入输入缓冲区,_KEY将完成它的工作并返回给调用者。以下是返回前的几条说明:

enter image description here

当您逐步执行这些操作时,自动显示功能将显示相应更新的变量和寄存器。

关于assembly - 如何使用 GDB 调试 jonesforth?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39628756/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com