【问题标题】:Displaying dictionary word with GDB in Jonesforth在 Jonesforth 中使用 GDB 显示字典单词
【发布时间】:2018-12-10 00:02:28
【问题描述】:

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 user-defined command 可行吗?还是更适合GDB Python 接口?

【问题讨论】:

    标签: gcc assembly gdb gnu-assembler forth


    【解决方案1】:

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

    这取决于 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 &amp;name_SWAP 我会得到以下信息:No symbol table is loaded. Use the "file" command.
    • @dharmatech 你是说x/1xw &amp;name_SWAP 有效,但print_key &amp;name_SWAP 无效?难以置信。
    • 这里有一个screenshot 正是发生了这种情况。 :-)
    • @dharmatech 我在set var ... 中缺少$。已更正。
    【解决方案2】:

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

    【讨论】:

    • 这里的想法是在字典条目中显示实际数据。 nmobjdump 显示 name_SWAP 的位置,但不显示字典条目中的字段(链接、名称长度、名称字符等)。
    • “Forth”方法是为此自己创建新的 Forth 单词。我正在处理C to Forth (jonesforth) to C interface。如果有任何重叠或合作机会,请告诉我。
    猜你喜欢
    • 2017-01-30
    • 2022-12-09
    • 2014-02-05
    • 1970-01-01
    • 2011-08-20
    • 2023-03-14
    • 2023-03-06
    • 1970-01-01
    • 2018-07-24
    相关资源
    最近更新 更多