gud-pdb/realgud-pdb的疑惑

使用Emacs来写Python,但调试环境一直不顺。开始是用Emacs自带的gud,支持M-x pdb命令直接来调用Python中pdb来调试(python -m pdb <python_buffer_name>),realgud则是M-x realgud:pdb,但遇到以下问题,寻求道友支持。

1、没有图形界面。gud的pdb操作和在终端操作基本一样,除了多几个菜单项,但是我看到许多帖子,M-x gdb是有图形界面的,比如Emacs 调试秘籍之 GUD 调试器 | Linux 中国 - 知乎,顶上有一排图标方便鼠标操作;M-x realgud:pdb也是有的,比如wikemacs#Realgud。但是我在使用中并没有图形界面,不知是否配置原因,我对gud和realgud都没有做任何配置。

2、跨buffer操作问题。gud或者realgud启动后,是自动开启一个debug buffer(* gud-pdb *或者类似名字),realgub还能拆分窗口上下联动,焦点保持在debug buffer中,看Emacs 调试秘籍之 GUD 调试器 | Linux 中国 - 知乎里截图也是上下联动的,但是我在使用中并没有;打断点如果是切换到python文件buffer瞄一眼代码,gud或realgud模式就没有了,再回来debug buffer敲命令打断点,来回切buffer真是蹩脚(用list不如直接看整个代码文件直观)。

3、GUI程序不能启动。我有一个PySide程序,使用gud的pdb不能显示程序窗口。

环境:Windows 10 + 原生GNU Emacs 28.2。

1 个赞
  1. 应该是需要打开 tool-bar-mode(不过也就是多几个按钮而已。我一般在终端里面调试,也没法用上这个功能,感觉还不如自己映射F5/F7/F8这几个按键)

  2. 这个功能叫做pdb tracking,也就是gud会提取pdb在s, n等命令执行后所打印的文件路径和行号,然后在对面window显示该部分代码、指示当前行。所以这里有个机关是只能用它所支持的调试器,否则提取的时候匹配不上,gud.el 里面说它原生pdb和ipdb,我如果装了pdbpp都会导致这个功能失效(虽然对比了好一阵也没法发现它的打印跟原生pdb有什么区别)。如果不是这个原因,我也不知道是什么原因了,有兴趣可以自己研究一下python-pdbtrack-setup-tracking这个函数。realgud支持的调试器比较多 ,不过我都懒得折腾

写完之后觉得不甘心,加上今晚的任务又没有那么紧迫了,于是研究了一下,初步发现了问题所在:

安装了pdbpp之后,用M-x pdb拉起调试,但是用s, n等命令的时候不会代码跟随,我拿python-pdbtrack-comint-output-filter-function里面的这段代码(略有改动)来跑(用ESC :发起)

 (when (re-search-backward python-pdbtrack-stacktrace-info-regexp nil t)
   (cons (string-to-number (match-string-no-properties 2)) (match-string-no-properties 1)))

发现它是能正确解析到文件名和行号的。

然后又看了一下*gud-pdb* buffercomint-output-filter-functions,发现它的值里面没有python-pdbtrack-comint-output-filter-function,于是自己执行了一下ESC : (add-hook 'comint-output-filter-functions 'python-pdbtrack-comint-output-filter-function)之后代码跟随又可以了

有没有图标确实是次要的,关键是F9、F10、F11这些键也没能把调试跑起来。

项目文档太简略了,不知道怎么操作。

而且,我有个带图形界面的程序(pyside程序),在终端里敲调试命令可以跑起来,在emacs gud/realgud里就是不能显示图形界面。

图标问题,确实是开启tool-bar-mode就有了。我还想,在退出调试,比如M-x debugger-quit命令时加hook或者advice,用来关闭tool-bar-mode、kill掉调试的buffer,该怎么写配置?

另一个更大的问题是图形界面程序,显示不出来。