Lisp_Object [MD:3008]

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

* この文書は無保証です。 [XHTML 1.0 Strict]