Assembly 如何使用GDB调试jonesforth?
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
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