Assembly 如何使用GDB调试jonesforth?

Assembly 如何使用GDB调试jonesforth?,assembly,gdb,gnu-assembler,forth,Assembly,Gdb,Gnu Assembler,Forth,jonesforth的启动通常如下所示: cat jonesforth.f - | ./jonesforth 在Ubuntu上调试jonesforth的好方法是什么? 如果您在Ubuntu上,请允许gdb连接到正在运行的进程: echo 0 > /proc/sys/kernel/yama/ptrace_scope 如果希望在重新启动期间保持该设置: vim /etc/sysctl.d/10-ptrace.conf 更新Makefile 将g标志添加到您的jonesforthMake

jonesforth的启动通常如下所示:

cat jonesforth.f  - | ./jonesforth
在Ubuntu上调试jonesforth的好方法是什么? 如果您在Ubuntu上,请允许
gdb
连接到正在运行的进程:

echo 0 > /proc/sys/kernel/yama/ptrace_scope
如果希望在重新启动期间保持该设置:

vim /etc/sysctl.d/10-ptrace.conf
更新Makefile 将
g
标志添加到您的
jonesforth
Makefile
配方中:

jonesforth: jonesforth.S
    gcc -g -m32 -nostdlib -static $(BUILD_ID_NONE) -o $@ $<
在另一个终端中,启动
gdb
,并将其连接到正在运行的jonesforth:

gdb --quiet --pid=`pgrep jonesforth`  ./jonesforth 
示例会话 以下是我启动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) 
\u KEY
使用内存中的一些变量:
缓冲区
currkey
bufftop
。它还使用了几个寄存器。让我们使用
gdb
自动显示
功能来显示这些:

display/8cb &buffer
display/1xw &currkey
display/1xw &bufftop
display/x   $eax
display/x   $ebx
现在,如果我们在
gdb
中键入
display
,我们将立即看到所有这些:

(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的好时机:

tui enable
gdb现在应该是这样的:

好的,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
嘿,看那个!
缓冲区中的前3个字符是
1
2
3

如果
%eax我(相当有限!)的经验是,LLVM调试器lldb在修补汇编语言程序时更加友好

JONESFORTH VERSION 47 
14499 CELLS REMAINING
OK 123
(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
3: x/xw &bufftop  0x8049d58:    0x0804c004