Hatena::Groupfreebsd

peanutsjamjamのFreeBSD日記 このページをアンテナに追加 RSSフィード

2006-05-02

デバッグ デバッグ - peanutsjamjamのFreeBSD日記 を含むブックマーク はてなブックマーク - デバッグ - peanutsjamjamのFreeBSD日記 デバッグ - peanutsjamjamのFreeBSD日記 のブックマークコメント

X Window System の終了時に次のようなメッセージが出でしまう。

FreeFontPath: FPE "/usr/X11R6/lib/X11/fonts/misc/" refcount is 2, should be 1; fixing.

Google で調べてみたけら、同様のメッセージが出ている事を訴える人が多数。でも、どうすればこれが消えるのか、なんでこんなメッセージが出てしまうのか、については見つけられなかった。なので、デバッグ開始。

準備

まず、/usr/ports/x11/xorg-libraries に移動して、make patch を行い、grep 等を使ってメッセージを出している箇所を特定する。

make patch

    % cd /usr/ports/x11/xorg-libraries
    % su
    Password:
    # make patch
    (略)

探す。

    # find . -name "*.c" | xargs -L1 grep -H FreeFontPath
    ./work/xc/lib/X11/GetFPath.c:XFreeFontPath (list)
    ./work/xc/programs/Xserver/hw/dmx/dmxfont.c:static void dmxFreeFontPath(char **fp)
    ./work/xc/programs/Xserver/hw/dmx/dmxfont.c:    dmxFreeFontPath(fp);
    ./work/xc/programs/Xserver/hw/dmx/dmxfont.c:    XFreeFontPath(oldFontPath);
    ./work/xc/programs/Xserver/hw/dmx/dmxfont.c:        XFreeFontPath(oldFontPath);
    ./work/xc/programs/Xserver/hw/dmx/dmxfont.c:            dmxFreeFontPath(fp);
    ./work/xc/programs/Xserver/hw/dmx/dmxfont.c:            XFreeFontPath(oldFontPath);
    ./work/xc/programs/Xserver/hw/dmx/dmxfont.c:        dmxFreeFontPath(fp);
    ./work/xc/programs/Xserver/hw/dmx/dmxfont.c:        XFreeFontPath(oldFontPath);
    ./work/xc/programs/Xserver/hw/dmx/dmxfont.c:    XFreeFontPath(oldFontPath);
    ./work/xc/programs/Xserver/dix/dixfonts.c:FreeFontPath(FontPathElementPtr *list, int n, Bool force)
    ./work/xc/programs/Xserver/dix/dixfonts.c:              ErrorF("FreeFontPath: FPE \"%.*s\" refcount is %d, should be %d; fixing.\n",
    ./work/xc/programs/Xserver/dix/dixfonts.c:    FreeFontPath(font_path_elements, num_fpes, FALSE);
    ./work/xc/programs/Xserver/dix/dixfonts.c:    FreeFontPath(font_path_elements, num_fpes, TRUE);

メッセージを出している場所

多分、ここ。

  • /usr/ports/x11/xorg-libraries/work/xc/programs/Xserver/dix/dixfonts.c
static void
FreeFontPath(FontPathElementPtr *list, int n, Bool force)
{
    int         i;

    for (i = 0; i < n; i++) {
        if (force) {
            /* Sanity check that all refcounts will be 0 by the time
               we get to the end of the list. */
            int found = 1;      /* the first reference is us */
            int j;
            for (j = i+1; j < n; j++) {
                if (list[j] == list[i])
                    found++;
            }
            if (list[i]->refcount != found) {
                ErrorF("FreeFontPath: FPE \"%.*s\" refcount is %d, should be %d; fixing.\n",
                       list[i]->name_length, list[i]->name,
                       list[i]->refcount, found);
                list[i]->refcount = found; /* ensure it will get freed */
            }
        }
        FreeFPE(list[i]);
    }
    xfree((char *) list);
}

FontPathElementPtr

で、FontPathElementPtr とは何ぞや、と調べてみると、このファイルに書いてあった。

  • /usr/ports/x11/xorg-libraries/work/xc/include/fonts/font.h
typedef struct _FontPathElement *FontPathElementPtr;

struct _FontPathElement

struct _FontPathElement という構造体は、次のファイルに書いてある。

  • /usr/ports/x11/xorg-libraries/work/xc/include/fonts/fontstruct.h
  • /usr/ports/x11/xorg-libraries/work/xc/exports/include/X11/fonts/fontstruct.h

この 2 つのファイルは、ビルドの最中に、どっちかがどっちかを作り出している(コピーしている)のだと思う。どっちがオリジナルなのかは不明。とりあえず保留。この 2 つのファイルdiff しても、全く同一だった。

/* External view of font paths */
typedef struct _FontPathElement {
    int         name_length;
    char       *name;
    int         type;
    int         refcount;
    pointer     private;
}           FontPathElementRec;

きょうはここまで。

トラックバック - http://freebsd.g.hatena.ne.jp/peanutsjamjam/20060502