[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]
[MD:3008] portable dumper for Emacs 21.1
- X-ml-count: 3008
- Subject: [MD:3008] portable dumper for Emacs 21.1
- From: Keiichiro Nagano (永野圭一郎) <knagano@xxxxxxxxx>
- Date: Fri, 15 Mar 2002 22:27:17 +0900
- User-agent: Wanderlust/2.8.1 (Something) EMY/1.13.9 (Art is long, life is short) SLIM/1.14.7 (酒井彩名) APEL/10.3 Emacs/21.1 (i586-pc-linux-gnulibc1) MULE/5.0 (SAKAKI)
1点だけ……
At Fri, 15 Mar 2002 21:33:52 +0900,
ABE Yasushi (阿部 靖司) wrote:
> # eval.c:3140にbreakかけて、2回contしてからstepで調べました。
> # Lisp_Objectの中身の見方がわからなかったんで、どのオブジェクトかはわ
> # からないです。
僕がいつもやっている Lisp_Object の見方を紹介します。FSF Emacs には
developer 向けの document は一切ないのですが (XEmacs には詳しい
internals manual があるみたいですけど)、おそらく standard な方法だと思
います。もっといいやり方があるかどうかは、知りません。
まず前提は、Lisp_Object は単なる整数 (int) で、その実態は多くの場合、
datatype と GC mark に関する bit が付いた pointer だということです。実
態は pointer が指す先にあります。例外は整数型 (Lisp_Int) ですが、これ
はもっと単純で、付加情報を取り除いた値がそのまま Lisp の整数の値です。
最も primitive な datatype については、lisp.h の enum Lisp_Type にあり
ます。
この pointer を取り出すために、gdb 専用の macro が、src/.gdbinit に書
いてあります。手順は、1. まず target の値を p で表示させる、2. xtype
で datatype を取り出す、3. datatype に従った gdb macro (xcons, xsymbol
など) を使うと pointer を取り出すことができる、となります。pointer の
指す先はほぼ間違いなく struct なので、通常の gdb の機能で中身を自由に
見ることができます。
具体例です。
(gdb) p Qt
$1 = 269159236
(gdb) xtype
Lisp_Symbol
0
(gdb) xsymbol
$2 = (struct Lisp_Symbol *) 0xb0b44
0x82eccb8 "t"
(gdb) p *$2
$3 = {
name = 0x64934,
value = 269159236,
function = 269159020,
plist = 1342189724,
obarray = 1074662456,
next = 0x0
}
と、これが基本の基本で、実際には Lisp_Vectorlike や Lisp_Misc には細か
い種類がありますし、この方法を真面目にやると cons の list を見るのが大
変なので、適当に pdump_message (XSTRING (Fprin1_to_string ())->data)
を埋めたりもします(もちろん prin1-to-string が使えるのは、
load/relocate/reinit が全部済んでからの世界の話です:)。
--
Keiichiro Nagano