在Emacs调试JAVA程序,使用GUD模式

很早以前就配置了在GUD模式下条用GDB调试C/C++程序。
GUD其实是支持非常多的调试器的,但是功能只有GDB(即调试C/C++)的时候比较强大。
GDB的设置可以参考:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

以下的配置是调试JAVA程序,用的也是GUD模式,是调用JDB实现的。
而非JDEE或者其他为Emacs制作的IDE环境(我嫌那种模式太烦了,而且我没办法在win和linux共享配置)。


在调试之前,编译的使用要加-g 参数,开启调试模式
实例:javac test.java -g

要开始调试需要用
M-x jdb
然后输入(XXX为要调试的class文件,不用带后缀名)
jdb XXX


这样就可以进入jdb-mode了
可以通过指令进行操作
gud-run 开始运行程序(直到遇到断点)
gud-cont 继续运行程序(第一次要使用gud-run 之后要使用 gud-cont)
gud-print 查看对象内容,和jdb的dump不太一样
gud-break 设置断点
gud-remove 清除断点
gud-next 下一行(跳过函数)
gud-step 步入(进入函数)
gud-finish 跳出函数
它默认有一些快捷键但是都太烦了,我都该成自己的了,下面有配置

JDB和GDB不太一样,没有提供gud-go的现成方法,但是我自己写了个函数吧gud-run和gud-cont 统一了一下。
(defun jdb-run-cont () "run/continue java program." (interactive) (save-excursion (if jdb-need-run (progn (gud-run nil) (setq need-run nil)) (gud-cont nil) )) )

在进入jdb模式的时候设置了一个jdb-need-run的全局变量
(add-hook 'jdb-mode-hook '(lambda () (setq jdb-need-run t) (global-set-key [(f4)] 'gud-kill) (global-set-key [(f5)] 'jdb-run-cont) (global-set-key [(f7)] 'gud-print) (global-set-key [(f8)] 'gud-remove) (global-set-key [(f9)] 'gud-break) (global-set-key [(f10)] 'gud-step) (global-set-key [(f11)] 'gud-next) (global-set-key [(f12)] 'gud-finish) (split-window-horizontally) (tabbar-backward-group) ))

这里有一个gud-kill也是一个自定义的函数,用于删掉debug的进程,(这个和GDB模式下的一样)
(defun gud-kill () "Kill process." (interactive) (with-current-buffer gud-comint-buffer (comint-skip-input)) (kill-process (get-buffer-process gud-comint-buffer)))

还有几个问题,希望以后有时间能解决它
1、下断点的时候没法想在GDB模式下载fring侧边栏显示一个小红点的表示
2、因为没有侧边栏的小红点,就暂时没有现成的方法可以把设置断点和清楚断点绑在同一个快捷键上(GDB的实现是通过判断侧边栏有没有位图实现的)
3、没有一个好的可以实时更新的watch窗口
4、因为gud.el是内置在Emacs程序里面的,所以没办法改源代码,暂时不知道要怎么把jdb dump命令也绑定到gud命令上



Emacs 就是一个坑,一个永远挖不完坑。。。。。

转载于:https://www.cnblogs.com/atskyline/archive/2012/05/15/2546970.html

你可能感兴趣的:(在Emacs调试JAVA程序,使用GUD模式)