在 Jonesforth 中用 GDB 显示字典单词

Displaying dictionary word with GDB in Jonesforth

Jonesforth中,字典词条布局如下:

<--- DICTIONARY ENTRY (HEADER) ----------------------->
+------------------------+--------+---------- - - - - +----------- - - - -
| LINK POINTER           | LENGTH/| NAME          | DEFINITION
|                        | FLAGS  |               |
+--- (4 bytes) ----------+- byte -+- n bytes  - - - - +----------- - - - -

我们可以使用 GDB 查看其中一个条目。 (有关将 GDB 与 Jonesforth 结合使用的详细信息,请参阅 this question。)

让我们将 SWAP 的字典条目的前 16 个字节显示为字符:

>>> x/16cb &name_SWAP
0x105cc:    -68 '4'    5 '[=11=]5'    1 '[=11=]1'    0 '[=11=]0'    4 '[=11=]4'    83 'S'    87 'W'    65 'A'
0x105d4:    80 'P'    0 '[=11=]0'    0 '[=11=]0'    0 '[=11=]0'    43 '+'    0 '[=11=]0'    1 '[=11=]1'    0 '[=11=]0'

你可以看看这里发生了什么。

前四个字节是指向字典中前一个单词的指针:

-68 '4'    5 '[=12=]5'    1 '[=12=]1'    0 '[=12=]0'

然后是名字的长度:

4 '[=13=]4'

然后我们看到字名的字符,"SWAP":

83 'S'    87 'W'    65 'A'   80 'P'

最后一些填充以在 32 位边界上对齐:

0 '[=15=]0'    0 '[=15=]0'    0 '[=15=]0'

如果有一种方法可以更好地格式化单词条目,那就太好了。

如果我们执行以下操作:

>>> x/1xw &name_SWAP
0x105cc:    0x000105bc

我们注意到 name_SWAP0x105cc

让我们用GDB的printf来显示词条:

>>> printf "link: %#010x   name length: %i   name: %s\n", *(0x105cc), (char)*(0x105cc+4), (0x105cc+5)
link: 0x000105bc   name length: 4   name: SWAP

好的,还不错!我们看到 link、名称长度和名称,都很好地显示和标记。

这里的缺点是我必须在对 printf:

的调用中使用显式地址
printf "link: %#010x   name length: %i   name: %s\n", *(0x105cc), (char)*(0x105cc+4), (0x105cc+5)

理想情况下,我可以这样说:

show_forth_word name_SWAP

它会显示上面的内容。

解决此问题的最佳方法是什么? GDB user-defined command? Or is it something more appropriate for the GDB Python 接口是否可行?

My question is, what's the best way to go about this?

这取决于GDB是否知道name_SWAP类型。如果是这样,Python 漂亮的打印机就是最佳选择。

如果没有,像用户定义的命令这样简单的事情可能会更容易。假设 32 位模式:

define print_key
 set var $v = (char*)$arg0
 printf "link: %#010x   name length: %i   name: %s\n", *((char**)$v), *($v+4), ($v+5)
end

我刚刚使用了 nm ,一个很好的旧 Unix 命令。