用GDB在Jonesforth中显示字典单词

4
Jonesforth中,字典条目的布局如下:
<--- DICTIONARY ENTRY (HEADER) ----------------------->
+------------------------+--------+---------- - - - - +----------- - - - -
| LINK POINTER           | LENGTH/| NAME          | DEFINITION
|                        | FLAGS  |               |
+--- (4 bytes) ----------+- byte -+- n bytes  - - - - +----------- - - - -

我们可以使用GDB查看其中一个条目。 (有关使用Jonesforth的GDB的详细信息,请参见this question。)
让我们将SWAP的字典条目的前16个字节显示为字符:
>>> 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
让我们使用GDB的printf来显示单词条目:
>>> 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接口?

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

如果我尝试print_key name_SWAPprint_key &name_SWAP,我会得到以下提示:未加载符号表。请使用“file”命令。 - dharmatech
2
@dharmatech 你是说 x/1xw &name_SWAP 可以工作,但是 print_key &name_SWAP 不行吗?这很难相信。 - Employed Russian
这是一个屏幕截图,准确地展示了这种情况。 :-) - dharmatech
1
@dharmatech 我在 set var ... 中漏了 $。已经更正。 - Employed Russian

0

我刚刚使用了那个老牌Unix命令nm


这里的想法是显示字典条目中的实际数据。nmobjdump显示了name_SWAP的位置,但它们没有显示字典条目中的字段(链接、名称长度、名称字符等)。 - dharmatech
“第四种”方法是自己创建新的Forth单词。 我正在开发一个[C到Forth(Jonesforth)到C接口] (https://github.com/udexon/5CSM/blob/master/Progress_20181203.md)。 如果有任何重叠或合作机会,请告知我。 - Liang Ng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接