4

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_SWAP0x105cc

让我们使用 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接口?

4

2 回答 2

4

我的问题是,最好的方法是什么?

这取决于 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
于 2018-12-10T01:10:02.023 回答
0

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

于 2018-12-10T14:30:54.880 回答