在 AIX 中建立特定于产品的调试器
2009-07-15 08:33:40 来源:WEB开发网在 example.exp 文件中导出例程
为了让插件起作用,必须实现和导出某些例程。为了导出这些例程,我创建了一个名为 “example.exp” 的文件。
dbx_plugin_version
dbx_plugin_session_init
dbx_plugin_session_command
dbx_plugin_session_event
dbx_plugin_session_destroy
编译插件的命令
下面的命令编译插件,生成 “libdbx_example.so” 文件。
cc -o libdbx_example.so example.c -bM:Sre -bE:example.exp -bnoentry
使用 dbx 插件进行调试的推荐方法
现在插件已经准备好了,可以使用它调试示例程序了。用 dbx 会话运行示例程序的前几个步骤与前面相同。如果编译的插件 “libdbx_example.so” 放在当前目录中(也是保存示例程序的目录),就不需要导出 DBX_PLUGIN_PATH 变量。在这种情况下,会自动装载此插件,不需要运行 “pluginload <plug-in name>” 命令。
[samyak@mogly plugin_example ]# dbx ./list
Type 'help' for help.
reading symbolic information ...
plug-in "./libdbx_example.so" loaded
(dbx) stop in free_list
[1] stop in free_list
(dbx) run
Info 1 : 10
Info 2 : 20
Info 3 : 30
Info 4 : 40
Info 5 : 50
Info 6 : 60
Info 7 : 70
Info 8 : 80
Info 9 : 90
Info 10 : 100
[1] stopped in free_list at line 43
43 while(List) {
(dbx) printlist
------Printing List -------
Node : 0x20000a28
Info : 10
Node : 0x20000a38
Info : 20
Node : 0x20000a48
Info : 30
Node : 0x20000a58
Info : 40
Node : 0x20000a68
Info : 50
Node : 0x20000a78
Info : 60
Node : 0x20000a88
Info : 70
Node : 0x20000a98
Info : 80
Node : 0x20000aa8
Info : 90
Node : 0x20000ab8
Info : 100
(dbx) cont
execution completed
(dbx)quit
在此示例中,我使用 “printlist” 别名输出整个链表。可以使用 plugin example printlist 命令显示相同的输出。这会显示所有节点的内容,不需要为每个节点重复运行命令,因此调试过程显著简化了。在 dbx 会话中的任何时候,都可以使用 pluginunload <plug-in name> 命令卸载此插件。
结束语
本文讲解了如何创建一个与程序相关的插件,可以使用它调试和分析程序的内部信息。对于大型产品,可以把插件扩展到任何级别,可以实现调试所需的关键分析逻辑,显著减少调试时间。对于处于维护阶段的复杂产品,也可以使用这种技术,从而显著降低寻找缺陷所需的调试技能和时间。
更多精彩
赞助商链接