让自己也惊叹的#emacs##gdb#联动,这才是最好的emacs-gdb


由于最近在做比较深入的android ndk开发,又不得不和命令行gdb打交道了——eclipse连gdb太慢了!
我觉得在emacs中用gud来操控ndk-gdb一直不妥。所以退而改用命令行方式。

对于bt(backtrace)命令打出来的call stack,一直都是再次从terminal中copy到emacs中查看的。
这天多花了点心思,想用define命令把这个call stack一次性显示到emacs的buffer中。

define不是最好的gdb扩展方法,因为现在有python gdb扩展接口了。只可惜team里的gdb高人没空帮我编译
with-python的gdb。

几番info文档查看,发现巧用logging命令,可以把gdb的内容输出到emacs中,这个简单而又诡异有用的脚本如下:

define gobt
  set logging file ~/.gdb.btt
  set logging overwrite on
  set logging redirect on
  set logging on
  bt
  set logging off
  shell echo \#Local Variables: \# >>  ~/.gdb.btt
  shell echo \#mode: compilation \# >>  ~/.gdb.btt
  shell echo \#End: \# >>  ~/.gdb.btt
  shell emacsclient -n ~/.gdb.btt
end



如果emacs的server启动了,会得到一个可交互的call stack,在哪行拍回车就跳转到相应的调用位置查看代码。

另一个命令更简单:
define eb
  source ~/.gdb.line
end



它的强大在于和以下emacs lisp配合:

(defun jr-debug-line ()
  (interactive)
  (let ((fn buffer-file-name)
        (ln (line-number-at-pos)))
    (with-temp-buffer (insert (format "b %s:%d" fn ln))
                      (write-region (point-min) (point-max) "~/.gdb.line"))
    (kill-new (format "b %s:%d" fn ln))))
(global-set-key (kbd "C-c b") 'jr-debug-line)


这样一来,就可以所见即所得地在emacs中对文件下断点了!

最后一个设置是EDITOR环境变量,为了用emacs查看gdb的当前行,正确的设置是:
export EDITOR="emacsclient -n "



这时,ed(it)命令会把你发送到gdb当前frame的当前行。

一个半双工的调试环境完成了。TUI的C-x C-a不够用时,ed就是神器呀。

P.S:上述gobt生成的back trace可以保存到任意位置,随时查看现场。这可比eclipse和intelij强大。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值