GR for UNIX のデバッグ方法

[TOP]

$Date: 2004/07/06 14:54:41 $

各コンポーネントのデバッグ方法を解説します。

基本的にデバッグ対象のプログラムはコンパイル時の -O2 オプションは全て外し、-g オプション付きでコンパイルします。

brltty

brltty/config.mk は、configure によって生成されるファイルですが、このルールでビルドやインストールを行うと gdb からシンボル情報が参照できません。configure でこれらのファイルを生成後、次の個所を手動で修正したのち、ビルドとインストールを行うようにします。

brltty/config.mk

生成される brltty 等のリンク時にデバックオプションが付いていないのでCOMMONLDFLAGS に -g オプションを追加します。

COMMONLDFLAGS = -g -Wl,-export-dynamic,-rpath,${exec_prefix}/lib/brltty

共有ライブラリのリンク時のオプションにデバックオプションが付いていないので -g オプションを追加します。

HOSTMKLIB = $(CC) -g -shared -Wl,-soname,SONAME -o

共有ライブラリの /lib/brltty ディレクトリへのインストール時に install -c -s のオプションで次のようにインストールされています。(-s はシンボルを削除するオプション)

# /usr/bin/install -c -s ../lib/*.so /lib/brltty

このままでは、共有ライブラリ内のシンボル情報が削除されてしまい gdb からライブラリ内を参照できないので、brltty/config.mk の次の個所から -s を外して make install するようにします。

INSTALL_PROGRAM = $(INSTALL_SCRIPT)

また、コンパイラの -O2 オプションはデバックが行いにくくなるので、config.mk の中から外す方が良でしょう。

gdb の実行時

brltty を実行するときに -n オプションをつけます。このオプションをつけないと fork してしまいます。

(gdb) set args -n

共有ライブラリとして実装されている音声ドライバの中をデバックする場合には、ドライバが読み込まれた後(共有ライブラリがロードされた後)にブレークポイントを設定するようにしてください。ドライバが読み込まれるまでは、ドライバ内を gdb で参照することはできません。

screen

スクリーンのデバックは、端末内で screen を動作させた後、gdb でプロセスアタッチすることでデバックが可能です。

% ps ax | grep -i screen
 2837 ?        S      0:00 xscreensaver -nosplash
 3878 ttyp1    S      0:00 ./screen
 3879 ?        S      0:00 ./SCREEN       <== こちらをアタッチ先にする
 3905 pts/0    S      0:00 grep -i screen

なおアタッチするプロセス ID は、screen が内部で fork するため、ps ax | grep -i screen を行って、大文字の SCREEN で表示されるプロセス ID を指定します。

gdb ./screen で gdb を起動後に attach コマンドを入力します。

(gdb) attach 3879            <== 3879 は PID
Attaching to program: /srv0/proj/univx/home/kudou/univx/src/screen/screen, process 3879
Reading symbols from /usr/lib/libncurses.so.5...done.
Loaded symbols for /usr/lib/libncurses.so.5
Reading symbols from /usr/lib/libutempter.so.0...done.
Loaded symbols for /usr/lib/libutempter.so.0
Reading symbols from /lib/libutil.so.1...done.
Loaded symbols for /lib/libutil.so.1
Reading symbols from /lib/libcrypt.so.1...done.
Loaded symbols for /lib/libcrypt.so.1
Reading symbols from /lib/tls/libc.so.6...done.
Loaded symbols for /lib/tls/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
Reading symbols from /lib/libnss_files.so.2...done.
Loaded symbols for /lib/libnss_files.so.2
0xffffe002 in ?? ()
(gdb) 

これで、screen が停止した状態になっているので、この後 ブレークポイントを設定後、c コマンドで継続する等して、デバック作業が開始でます。

IPCIF のデバック方法

ipcif/ipcif.h, ipcif/ipcifcmd.h を参照してください。brltty と外部プロセスとの間で、情報を共有したり、メッセージをやりとりするインターフェース(IPCIF と呼んでいる)が定義されています。

ipcif/dummysrv は brltty の代わりに IPCIF のサーバとなれるデバック用のプログラムです。IPCIF を使って渡されるコマンドをリアルタイムに画面に表示します。

ipcif/dumpshm は IPCIF 内の共有メモリによる仮想画面の内容をダンプするプログラムです。


[TOP]

Copyright (C) 2003-2004 Jun Ishikawa and CYPAC Co., Inc.