emacs 源码分析(五)

emacs源码分析(五)

因为emacsC源码中有大量的宏,在gdb中调试是非常痛苦的,所以有下面的内容:

一个更方便的调试emacs源码的方式

就像在“emacs源码分析(四)”中提到的那样,要么是定义这么复杂的宏:

(gdb) macro define sym_name(lisp_obj) XSTRING(XSYMBOL(lisp_obj).u.s.name).u.s.data
(gdb) p sym_name(0xdd70)
$9 = (unsigned char *) 0x100a6c4c3  "top-level"

要么就是写下这么一大段gdb命令:

(gdb) p XTYPE(XCONS(XCONS(Vtop_level).u.s.u.cdr).u.s.car)
$20 = Lisp_String
(gdb) p XSTRING(XCONS(XCONS(Vtop_level).u.s.u.cdr).u.s.car).u.s.data
$21 = (unsigned char *) 0xa000dfe08 "loadup.el"

不经意间我发现了emacs提供了调试帮助文件,见etc/DEBUG。这很有帮助,以下内容大部分来自该文件。

  1. 文章中建议在emacs中使用M-x gdb RET启动gdb,这个方式我没有采用,因为我经常使用的bash里快速切换历史命令的C-nC-p快捷键,但在emacs里变成了上下移动光标。
  2. 要把src目录中的.gdbinit文件加载进来,里面有大量的自定义的调试命令,用这个方式加载:
(gdb) source ./src/.gdbinit
  1. 设置条件断点是常规操作,这里提了一下:
(gdb) break foo.c:1234 if PT >= 9876
  1. 当出错时想要查看堆栈,在哪个函数处下断点呢?答:Fsignal

  2. 只要加载了src/.gdbinit文件后就有了pp命令,就可以替换“emacs源码分析(四)”中提到的p XSTRING(XCONS(XCONS(Vtop_level).u.s.u.cdr).u.s.car).u.s.data了,这下打印Vtop_level变量就很方便了,只需要:

(gdb) pp Vtop_level
(load "loadup.el")
  1. 除了pp命令,还有很多,比如我用过的prxtypepvxstringxsymbol等等。
  2. 对于xtype命令需要说明一下,如果没有运行过gdbp命令而直接运行xtype,则该命令不会有任何输出,如图:
    在这里插入图片描述

你可能感兴趣的:(emacs)