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
需要解释一下的话:
XSYMBOL从Lisp_Object中获得Lisp_Symbol,Lisp_Symbol的u.s.name里存放着Lisp_Object。XSTRING从Lisp_Object里获得Lisp_String,Lisp_String的u.s.data里存放着unsigned char *。macro define命令定义了一个gdb宏sym_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_level的car,我想再看看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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!