emacs 源码分析(四)

2024-01-10 09:31:27

<2023-11-08 Wed>

emacs源码分析(四)

在调试emacs源码时一个使用gdb的小技巧:如果要查看一个Lisp_Symbol结构体变量中名称的字符串可以这么来,比如这个0xdd70就是一个Lisp_Symbol变量,它对应的名称字符串是"top-level",如下:

(gdb) p XSTRING(XSYMBOL(0xdd70).u.s.name).u.s.data
$8 = (unsigned char *) 0x100a6c4c3 <o_fwd+15843> "top-level"
(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 <o_fwd+15843> "top-level"
(gdb) macro exp sym_name(Lisp_Object)
expands to: XSTRING(XSYMBOL(Lisp_Object).u.s.name).u.s.data

需要解释一下的话:

  1. XSYMBOLLisp_Object中获得Lisp_SymbolLisp_Symbolu.s.name里存放着Lisp_Object
  2. XSTRINGLisp_Object里获得Lisp_StringLisp_Stringu.s.data里存放着unsigned char *
  3. macro define命令定义了一个gdbsym_name,方便调试过程中使用。

另外,可以通过XTYPE来查看一个Lisp_Object的类型,比如我看代码里不知道Vtop_level是什么类型,我可以:

(gdb) p XTYPE(Vtop_level)
$10 = Lisp_Cons
(gdb) p XTYPE(0xdd70)
$11 = Lisp_Symbol
(gdb) p XCONS(Vtop_level)
$12 = (struct Lisp_Cons *) 0xa000ef5d0
(gdb) p XCONS(Vtop_level).u.s.car
$13 = (Lisp_Object) 0x9210
(gdb) p XTYPE(XCONS(Vtop_level).u.s.car)
$14 = Lisp_Symbol
(gdb) p sym_name(XCONS(Vtop_level).u.s.car)
$15 = (unsigned char *) 0x100a6b020 <o_fwd+10560> "load"

这里用上了刚才定义的sym_name宏。看上面的输出非常直观,胜过千言万语,另参考一下:“EmacsWiki Hacker Guide”会有大收获。

看了上面的Vtop_levelcar,我想再看看cdr

(gdb) p XTYPE(XCONS(Vtop_level).u.s.u.cdr)
$17 = Lisp_Cons
(gdb) p XCONS(XCONS(Vtop_level).u.s.u.cdr)
$18 = (struct Lisp_Cons *) 0xa000ef5c0
(gdb) p XCONS(XCONS(Vtop_level).u.s.u.cdr).u.s.car
$19 = (Lisp_Object) 0xa001251e4
(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"

所以这里的Vtop_level就是一段lisp代码:

(load loadup.el)

文章来源:https://blog.csdn.net/ftuc5dn/article/details/135477336
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。