在Jonesforth中,字典条目的布局如下:
<--- DICTIONARY ENTRY (HEADER) ----------------------->
+------------------------+--------+---------- - - - - +----------- - - - -
| LINK POINTER | LENGTH/| NAME | DEFINITION
| | FLAGS | |
+--- (4 bytes) ----------+- byte -+- n bytes - - - - +----------- - - - -
我们可以使用 GDB 查看其中一个条目。(有关在 Jonesforth 中使用 GDB 的详细信息,请参阅此问题。)
让我们将字典条目的前 16 个字节显示SWAP
为字符:
>>> x/16cb &name_SWAP
0x105cc: -68 '\274' 5 '\005' 1 '\001' 0 '\000' 4 '\004' 83 'S' 87 'W' 65 'A'
0x105d4: 80 'P' 0 '\000' 0 '\000' 0 '\000' 43 '+' 0 '\000' 1 '\001' 0 '\000'
你可以看到这里发生了什么。
前四个字节是字典中前一个单词的指针:
-68 '\274' 5 '\005' 1 '\001' 0 '\000'
然后是名称的长度:
4 '\004'
然后我们看到单词名称“SWAP”的字符:
83 'S' 87 'W' 65 'A' 80 'P'
最后是一些填充以对齐 32 位边界:
0 '\000' 0 '\000' 0 '\000'
如果有一种方法可以更好地格式化单词条目,那就太好了。
如果我们执行以下操作:
>>> x/1xw &name_SWAP
0x105cc: 0x000105bc
我们注意到name_SWAP
在0x105cc
。
让我们使用 GDBprintf
来显示单词 entry:
>>> printf "link: %#010x name length: %i name: %s\n", *(0x105cc), (char)*(0x105cc+4), (0x105cc+5)
link: 0x000105bc name length: 4 name: SWAP
好吧,这还不错!我们看到链接、名称长度和名称,都很好地显示和标记。
这里的缺点是我必须在调用中使用显式地址printf
:
printf "link: %#010x name length: %i name: %s\n", *(0x105cc), (char)*(0x105cc+4), (0x105cc+5)
理想情况下,我只能说:
show_forth_word name_SWAP
它会显示上述内容。
解决这个问题的最佳方法是什么?这可以通过GDB 用户定义的命令来实现吗?还是更适合GDB Python接口?