如何在没有gdb Python API的情况下在C或Python代码中控制gdb?

如何在没有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接口)。正如上面评

我正在尝试用python或c编写一个程序,可以使用gdb调试c代码

我已经读了和。但它们或多或少是用python编写gdb脚本的解决方案。因为我将使用arm gdb调试嵌入式程序,所以我无法在gdb中启用python脚本


我的目标是创建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)规定响应“由零个或多个带外响应组成” 记录之后(可选)有一条结果记录:

您应该意识到,由于任何东西都可以在任何时候到达,因此a
read()
在套接字上,显然可以返回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呢?