<p>正如上面的评论中所承诺的,我已经将我的(早期的、不完整的、几乎肯定有缺陷的)ruby作品发布到<a href="http://github.com/mcarpenter/rubug" rel="noreferrer">http://github.com/mcarpenter/rubug</a>。在</p>
<p>这里有一个例子(你可以在
<a href="https://github.com/mcarpenter/rubug/tree/master/examples/breakpoint" rel="noreferrer">^{<cd1>}</a>)。函数<code>check_for_crash</code>是可以调用的回调函数
在程序<code>factorial</code>被设置为运行后。断点采用函数名
(<code>fac</code>;前导冒号表示这是一个
ruby符号在这里是一个轻量级的符号
字符串)。在</p>
<pre><code>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
</code></pre>
<p>这是公平的警告你,代码可能是。。。粗俗的。目前(这是我停止的地方)没有什么工作(在我工作中途进行gdb更新之后,请参见
<em>语法</em>以下)。在</p>
<p>在相同的目录中有很多例子
但可能会有帮助的名称。到(尝试!)运行它们,您需要执行以下操作:</p>
^{pr2}$
<p>考虑到写这篇文章的时间,你应该用ruby1.8
如果你有选择的话(我当时不喜欢1.9,可能有
1.9)下的字符串编码问题。在</p>
<p>响应的解析由treetop执行
<a href="http://treetop.rubyforge.org" rel="noreferrer">http://treetop.rubyforge.org</a>,一个PEG解析器。用
新鲜的眼睛我确信它可以简化。你需要安装这个
(以及任何其他必需的gem)使用<code>gem install ...</code>。在</p>
<p>如果你做Python疗法,还有一些建议:</p>
<h3>文档</h3>
<p>很少有外部的“使用GDB调试”
(第22章)。我把这个PDF文件和ch.22作为一个单独的文件扔进
存储库的<a href="https://github.com/mcarpenter/rubug/tree/master/docs" rel="noreferrer">docs</a>部分。在</p>
<h3>异步</h3>
<p>协议是不同步的(一开始我以为这是
命令/响应类型协议,这是一个错误)。如果我愿意
重新实现这个我可能会用事件机或者
而不是滚动我自己的<code>select()</code>循环。在</p>
<h3>语法</h3>
<p>语法有点。。。令人困惑。尽管文件
(27.2.2)声明响应“由零个或更多带外组成
记录后面有一个结果记录(可选)::</p>
<pre><code>`output -> ( out-of-band-record )* [ result-record ] "(gdb)" nl`
</code></pre>
<p>你应该知道,因为任何东西都可以在任何时候到达<code>read()</code>
显然可以返回async/result/<em>more
异步</em>/终止符(!)。例如,我在当前的gdb中看到了这一点:</p>
<pre><code>=thread-group-started,id="i1",pid="1086"
=thread-created,id="1",group-id="i1"
^running
*running,thread-id="all"
(gdb)
</code></pre>
<p>以<code>^</code>开头的行是一个结果记录,所有其他行都是异步的(那么
终结者)。这似乎是
规范。在</p>
<h3>速度</h3>
<p>我主要关注的是安全,我对MI感兴趣
GDB也是自动的,用于二进制检查
慢(在调试器中启动程序的成本)。基督教青年会。在</p>
<h3>MI/CLI映射</h3>
<p>在标准gdb CLI命令集中有一些东西
无法使用MI命令实现。我有骨架
这样的代码:</p>
<pre><code>gdb = Gdb::MI.new
gdb.cli(:file, '/bin/ls')
gdb.cli(:set, :args, '> /dev/null')
gdb.cli(:run)
gdb.cli(:quit)
</code></pre>
<p>(我认为,对于我们这些非MI专家,但对gdb知识渊博的用户来说,这是非常好和明确的)。
我现在不记得那些有问题的事情是什么了(已经一年多了)
但如果这些神经元真的被激活了,我会回来
更新这个。在</p>
<h3>替代品</h3>
<p>我刚开始的时候
在这条路上,我发现了一个Jamis Buck的博客:
<a href="http://weblog.jamisbuck.org/2006/9/25/gdb-wrapper-for-ruby" rel="noreferrer">http://weblog.jamisbuck.org/2006/9/25/gdb-wrapper-for-ruby</a>这包装了一个
popen()中的gdb命令行会话,这让我有点畏缩。在
特别的人可能会认为它是脆弱的,因为gdb不同意
保证CLI输出的稳定性。你可以(或不可以)
喜欢这种方法。在</p>
<p>如果您使用的是windows,那么PyDbg/PeiMei可能会感兴趣:<a href="http://code.google.com/p/paimei/" rel="noreferrer">http://code.google.com/p/paimei/</a></p>
<p>你可能还喜欢这本书<a href="https://rads.stackoverflow.com/amzn/click/com/1593271921" rel="noreferrer">Grey Hat Python: Python Programming for Hackers</a>(Seitz)。同样,大部分基于windows,但可能会被证明是鼓舞人心的。在</p>