如何在没有gdb Python API的情况下在C或Python代码中控制gdb?
我正在尝试用python或c编写一个程序,可以使用gdb调试c代码 我已经读了和。但它们或多或少是用python编写gdb脚本的解决方案。因为我将使用arm gdb调试嵌入式程序,所以我无法在gdb中启用python脚本如何在没有gdb Python API的情况下在C或Python代码中控制gdb?,python,c,gdb,arm,Python,C,Gdb,Arm,我正在尝试用python或c编写一个程序,可以使用gdb调试c代码 我已经读了和。但它们或多或少是用python编写gdb脚本的解决方案。因为我将使用arm gdb调试嵌入式程序,所以我无法在gdb中启用python脚本 我的目标是创建gdb的高级抽象。例如,启动gdb,设置一些断点,然后在我的代码中继续。我还阅读了一些gdb/mi接口的资料。但有谁能告诉我如何使用gdb/mi接口创建gdb进程并从c/python代码与gdb通信?(幸运的是,我的arm gdb支持gdb/mi接口)。正如上面评
我的目标是创建gdb的高级抽象。例如,启动gdb,设置一些断点,然后在我的代码中继续。我还阅读了一些gdb/mi接口的资料。但有谁能告诉我如何使用gdb/mi接口创建gdb进程并从c/python代码与gdb通信?(幸运的是,我的arm gdb支持gdb/mi接口)。正如上面评论中承诺的那样,我已经将我的(早期的、不完整的、几乎肯定有缺陷的)ruby工作发布到了 这里有一个例子(你可以在 ).Function
check\u for\u crash
是一个可以调用的回调函数
在名为factorial
的程序设置为运行后。断点采用函数名
(fac
;前导冒号表示这是一个
ruby符号在这里是一个轻量级的符号
字符串)
这是公正的警告你,代码可能是。。。粗糙的。目前(这是我停下来的地方)没有什么效果(在我工作的中途进行gdb更新之后,请参阅)
语法(见下文)
同一个目录中有许多示例
不过,这个名字可能会有帮助。要(尝试!)运行它们,您需要执行以下操作:
rake clean
rake grammar
rake make
cd examples/simple_fuzzer
ruby -I ../../lib -r rubygems simple_fuzzer.rb
gdb = Gdb::MI.new
gdb.cli(:file, '/bin/ls')
gdb.cli(:set, :args, '> /dev/null')
gdb.cli(:run)
gdb.cli(:quit)
考虑到写这篇文章的时间,你可能应该使用ruby1.8
如果你有选择的话(我当时没有进入1.9,可能有)
字符串编码问题(见第1.9节)
响应的解析由treetop执行
,一个PEG解析器。用英语看语法
我相信它可以简化。你需要安装这个
(以及任何其他必需的gem)使用gem安装…
如果您进行Pythonize,还有一些提示:
文档
除了“用GDB调试”之外,几乎没有什么
(第22章)。我把这个PDF和第22章作为一个单独的文件扔进了
存储库的部分
异步的
协议是非同步的(起初我认为这是
命令/响应类型协议,这是一个错误)。如果我是
重新实现这一点,我可能会使用事件机或
libevent,而不是滚动我自己的select()
循环
文法
语法有点。。。令人困惑虽然文件
(27.2.2)规定响应“由零个或多个带外响应组成”
记录之后(可选)有一条结果记录:
您应该意识到,由于任何东西都可以在任何时候到达,因此aread()
在套接字上,显然可以返回async/result/more
异步/终止符(!)。例如,我在当前的gdb中看到:
=thread-group-started,id="i1",pid="1086"
=thread-created,id="1",group-id="i1"
^running
*running,thread-id="all"
(gdb)
以^
开头的行是一个结果记录,所有其他行都是异步的(然后
终结者)。这似乎是一个相当重要的缺陷
规格
速度
我的主要关注点是安全,我对MI感兴趣
自动模糊化、二进制检查等。为此,GDB/MI也是如此
缓慢(在调试器中启动程序的成本)。YMMV
MI/CLI映射
在标准GDBCLI命令集中有一些我需要的东西
无法查看如何使用MI命令实现。我有骨架
类似这样的代码:
rake clean
rake grammar
rake make
cd examples/simple_fuzzer
ruby -I ../../lib -r rubygems simple_fuzzer.rb
gdb = Gdb::MI.new
gdb.cli(:file, '/bin/ls')
gdb.cli(:set, :args, '> /dev/null')
gdb.cli(:run)
gdb.cli(:quit)
(我认为,对于我们这些非MI专家但熟悉gdb的用户来说,这一点很好,也很清楚)。
我现在不记得那些有问题的事情是什么(已经一年多了)
自从我看到这个)但如果这些神经元真的激活了,我会回来
更新这个
选择
我刚开始的时候
在这条路上,我发现了Jamis Buck的一篇博文:
这包裹了一个
popen()中的gdb命令行会话,这让我有点畏缩。在里面
特别的人可能会认为它是易碎的,因为gdb不制造任何东西
保证CLI输出的稳定性。你可以(也可以不)
我更喜欢这种方法
如果您使用的是windows,那么PyDbg/PeiMei可能会感兴趣:
你可能也喜欢这本书(Seitz)。再说一次,大部分是基于windows的,但可能会被证明是鼓舞人心的。如何使用?它是python版本,对于使用外部命令自动执行任务非常有用。您列出的链接更多的是“从GDB调用python”,但您要问的是如何从python或C调用GDB。接口无疑是一种方式。Eclipse、Emacs和KDevelop使用GDB/MI抽象调试接口。我个人使用过KDevelop和三种不同的交叉编译gdb版本,分别用于ARM、AVR和H8S。MI协议被设计为由软件解析,因此语法非常规则
谷歌搜索产生了一个可以让你开始的ruby库。我有一个未发布的ruby库(抱歉,不是python或C)可以做到这一点。。。已放弃但仍在运行的项目(GDB MI消息抽象和解析器/生成器、CLI/库调用映射等)。如果有用的话,我可以把它贴出来?@Martin如果你能把它贴出来,我会很高兴的,这样我就可以把它作为参考了。。。谢谢你的努力。好的,我会做一点挖掘:)并发布一个带有链接的答案。为什么不直接使用libptrace呢?