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

2024-05-16 01:39:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我读过solution of Tom和{a2}。但它们或多或少是用python编写gdb脚本的解决方案。因为我要使用armgdb调试嵌入式程序,所以我不能在gdb中启用python脚本。在

我的目标是创建gdb的高层抽象。例如,启动gdb,设置一些断点并在我的代码中继续。我还读了一些gdb/mi接口的资料。但是谁能告诉我如何使用gdb/mi接口来创建一个gdb进程并从c/python代码与gdb通信?(幸运的是,我的arm gdb支持gdb/mi接口)。在


Tags: of代码程序脚本a2目标解决方案mi
3条回答

使用http://www.noah.org/python/pexpect/怎么样?它是http://en.wikipedia.org/wiki/Expect的python版本,对于使用外部命令自动执行任务非常有用。在

您列出的链接更多的是“从GDB调用Python”,但是您要问的是如何从Python或C调用GDB,GDB/MI接口是最好的选择。Eclipse、Emacs和KDevelop使用GDB/MI抽象调试接口。我个人在ARM、AVR和H8S上使用过三个不同的交叉编译gdb版本的KDevelop。在

谷歌搜索得到了一个Python GDB wrapper,应该可以让你开始。在

正如上面的评论中所承诺的,我已经将我的(早期的、不完整的、几乎肯定有缺陷的)ruby作品发布到http://github.com/mcarpenter/rubug。在

这里有一个例子(你可以在 ^{})。函数check_for_crash是可以调用的回调函数 在程序factorial被设置为运行后。断点采用函数名 (fac;前导冒号表示这是一个 ruby符号在这里是一个轻量级的符号 字符串)。在

EXE = 'factorial'

def check_for_crash(gdb, event)
  case event.type
  when :command_response
    raise RuntimeError, 'oops' unless
  [ :done, :running ].include? event.response.result
  when :breakpoint
    puts 'Breakpoint reached'
    pp event
    gdb.continue
  when :exit
    puts 'Exit'
    gdb.stop_event_loop
    exit
  end
end

gdb = Rubug::Gdb.new
resp = gdb.file EXE
gdb.register_callback(method :check_for_crash)
gdb.break(:fac)
gdb.run '5 > /dev/null'
gdb.start_event_loop

这是公平的警告你,代码可能是。。。粗俗的。目前(这是我停止的地方)没有什么工作(在我工作中途进行gdb更新之后,请参见 语法以下)。在

在相同的目录中有很多例子 但可能会有帮助的名称。到(尝试!)运行它们,您需要执行以下操作:

^{pr2}$

考虑到写这篇文章的时间,你应该用ruby1.8 如果你有选择的话(我当时不喜欢1.9,可能有 1.9)下的字符串编码问题。在

响应的解析由treetop执行 http://treetop.rubyforge.org,一个PEG解析器。用 新鲜的眼睛我确信它可以简化。你需要安装这个 (以及任何其他必需的gem)使用gem install ...。在

如果你做Python疗法,还有一些建议:

文档

很少有外部的“使用GDB调试” (第22章)。我把这个PDF文件和ch.22作为一个单独的文件扔进 存储库的docs部分。在

异步

协议是不同步的(一开始我以为这是 命令/响应类型协议,这是一个错误)。如果我愿意 重新实现这个我可能会用事件机或者 而不是滚动我自己的select()循环。在

语法

语法有点。。。令人困惑。尽管文件 (27.2.2)声明响应“由零个或更多带外组成 记录后面有一个结果记录(可选)::

`output -> ( out-of-band-record )* [ result-record ] "(gdb)" nl`

你应该知道,因为任何东西都可以在任何时候到达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/CLI映射

在标准gdb CLI命令集中有一些东西 无法使用MI命令实现。我有骨架 这样的代码:

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的博客: http://weblog.jamisbuck.org/2006/9/25/gdb-wrapper-for-ruby这包装了一个 popen()中的gdb命令行会话,这让我有点畏缩。在 特别的人可能会认为它是脆弱的,因为gdb不同意 保证CLI输出的稳定性。你可以(或不可以) 喜欢这种方法。在

如果您使用的是windows,那么PyDbg/PeiMei可能会感兴趣:http://code.google.com/p/paimei/

你可能还喜欢这本书Grey Hat Python: Python Programming for Hackers(Seitz)。同样,大部分基于windows,但可能会被证明是鼓舞人心的。在

相关问题 更多 >