在 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_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
好的,还不错!我们看到 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 命令。
在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_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
好的,还不错!我们看到 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 命令。