• 検索結果がありません。

デバッガ(gdb + RTDebugger)を使用する方法

ドキュメント内 B5size manual.dot (ページ 74-79)

第 6 章  RTLinux でのソフトウェア開発 70

6.1.2  デバッガ(gdb + RTDebugger)を使用する方法

次に、デバッガを使用する方法について説明します。

RTLinuxにはRTLinuxモジュールの部分のデバッガが付属しています。このデバッガは、gdbやDDD

等のLinux用のデバッガにRTLinuxモジュール部分のトレースを行う機能を拡張するものです。

これにより、通常のgdbやDDD等ではトレースすることのできない、RTLinuxモジュールの内部の コードについてトレースすることが可能になります。(Linuxカーネル内のトレースを行うことは できません。)

RTLinux用のデバッガを使用する場合には、RTLinuxのコンパイル(『57ページ  4.2  RTLinux対応

ソフトウェアのインストール』のRTLinuxのコンパイル)で、「make xconfig」を実行して表示され るRTLinuxのオプション設定で、CONFIG_RTL_DEBUGを有効にする必要があります。

「Support option」をクリックして、オプションメニューを開きます

make xconfigのメニューダイアログが表示されたら、Support optionsをクリックして、オプション メニューを開きます。

「RTLinux Debugger」をyにします

オプションメニューのRTLinux Debuggerの項目がyになっていることを確認してください。デフォ ルトではyになっています。

その後は、『14ページ  第2章  RTLinuxのインストール』の手順に従って、RTLinuxのコンパイ ル/インストールを実行すれば、RTLinux用のデバッガが使用可能になります。

(以降の手順は、『14ページ  第2章  RTLinuxのインストール』まで完了しているものとして進め

ます。)

それでは、RTLinuxに付属のサンプルプログラム「hello.c」を使用して、デバッガを動かします。

デバッグを開始する前に必要な作業としては、breakpointの設定とコンパイルオプション「-g」を 指定して再コンパイルを行う必要があります。

通常、gdbを使用してデバッグを行う場合には、デバッガ起動中に「run」コマンド等でプログラ ムを開始できるため、元のソースコードには手を加えなくてもデバッグを行えます。(breakpoint はgdb実行中に設定可能です。)

ところが、gdb実行中には「.o」モジュールの組み込み(insmod)は、行うことができません。

RTLinuxのデバッガは基本的にgdb(DDD)のインタフェースを使用して行うため、モジュールを組 み込みはデバッガを起動する前に行わなければいけません。

「hello.o」モジュールは、insmodコマンドで組み込みを行うと動作が開始しますので、デバッグを 実行する前に動作を停止させたい部分には、予めbreakpoint( )を挿入しておく必要があります。

それではまず、エディタでhello.cを開き、デバッグに必要なbreakpoint( )とrtl_debug.hを追加します。

# cd /usr/src/rtlinux/rtlinux-3.1/examples/hello # emacs hello.c

「hello.c」のstart_routineの修正箇所 1

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

#include <rtl.h>

#include <time.h>

#include <pthread.h>

#include <rtl_debug.h>

pthread_t thread;

void * start_routine(void *arg) {

struct sched_param p;

p . sched_priority = 1;

pthread_setschedparam (pthread_self(), SCHED_FIFO, &p);

pthread_make_periodic_np (pthread_self(), gethrtime(), 500000000);

breakpoint();

while (1) {

pthread_wait_np ();

rtl_printf("I'm here; my arg is %x¥n", (unsigned) arg);

} return 0;

}

この、breakpoint( )はi386では単にint3を実行して、例外を発生しているだけですので、0除算等で例外 が発生した場合にも、デバッガにbreakpointとしてアタッチされます。(「rtlinux-3.1/include/rtl_debug.h」

の30行目を参照)

次に、モジュールにデバッグ情報を付加するために、コンパイルオプションに「-g」が必要になりま す。

RTLinux用のモジュールをコンパイルする際には、rtl.mkをインクルードしてmakeの設定を行います。

rtl.mkのデフォルト設定にはCFRAGSに「-g」は予め設定されていますので、とくに修正の必要はあり ません。

また、「-fomit-frame-pointer」がフラグに設定されている場合には、それを削除する必要があります。

# emacs ../../rtl.mk

「rtl.mk」

1 2 3 4 5

6 7 8

#Automatically generated by RTLinux Makefile RTL_DIR = /usr/src/rtlinux/rtlinux-3.1

RTLINUX_DIR = /usr/src/linux

INCLUDE= -I/usr/src/linux/include -I/usr/src/rtlinux/rtlinux-3.1/include -I/usr/src/rtlinux/rtlinux-3.1/include/compat

CFLAGS = -D__KERNEL__ -Wall -Wstrict-prototypes -fno-strict-aliasing -pipe -march=i686 -DMODULE -DMODVERSIONS

-include /usr/src/rtlinux/linux-2.4.4/include/linux/modversions.h -g -D__RTL__ -D_LOOSE_KERNEL_NAMES -O2 -I/usr/src/linux/include -I/usr/src/rtlinux/rtlinux-3.1/include

-I/usr/src/rtlinux/rtlinux-3.1/include/compat -I/usr/src/rtlinux/rtlinux-3.1/include/posix ARCH = i386

CC = gcc

CXXFLAGS = -D__KERNEL__ -Wall -Wstrict-prototypes -fno-strict-aliasing -pipe -march=i686 -DMODULE -DMODVERSIONS

-include /usr/src/rtlinux/linux-2.4.4/include/linux/modversions.h -g -D__RTL__ -D_LOOSE_KERNEL_NAMES -I/usr/src/linux/include -I/usr/src/rtlinux/rtlinux-3.1/include

-I/usr/src/rtlinux/rtlinux-3.1/include/compat

-I/usr/src/rtlinux/rtlinux-3.1/include/posix -fno-exceptions -fno-rtti

準備が完了しましたら、helloの再コンパイルを行い、「rtl_debug.o」と「hello.o」を順番に組み込 みます。組み込みの順番を間違えると正常に組み込みが行えません。

# make

# insmod ../../debugger/rtl_debug.o # insmod hello.o

rtl.debug: exception 0x3 in hello (EIP=0xc88de0d0), thread id 0xc44b8000: (re)start GDB to debug

ここで、デバッガモジュールのメッセージが表示されて、hello.oの実行が中断されているのがわかりま す。

次に、gdbを起動して、モジュールのデバッグを開始します。

# gdb hello.o GNU gdb 19990928

Copyright 1998 Free Software Foundation, Inc.

GDB is free software, covered by the GNU General Public License, and you are

welcome to change it and/or distribute copies of it under certain conditions.

Type "show copying" to see the conditions.

There is absolutely no warranty for GDB. Type "show warranty" for details.

This GDB was configured as "i686-pc-linux-gnu"...

(gdb)

gdbのプロンプトが表示されますので、ここでgdbのコマンドを実行します。

(gdb)list

1 #include <rtl.h>

2 #include <time.h>

3 #include <pthread.h>

4 #include <rtl_debug.h>

5 pthread_t thread;

6

7 void * start_routine(void *arg) 8 {

9 struct sched_param p;

10 p . sched_priority = 1;

まず、「list」を実行して、モジュールのソースコードを表示します。

hello.cのソースコードが表示されます。

モジュールの実行は、RT-FIFOを介して行います。デフォルトではrtf10をデバッグ用の端末とし て使用する設定になっていますので、targetコマンドを実行します。

(gdb)target remote /dev/rtf10

start_rutine (arg=0x0) at hello.c:17 17 pthread_wait_np ();

(gdb)

ステップ実行でトレースしたい場合には、「step」もしくは「s」コマンドを入力するとステップ 実行を行います。

(gdb)target remote /dev/rtf10

start_rutine (arg=0x0) at hello.c:17 17 pthread_wait_np ();

(gdb)

さらに、ブレークポイントを追加したい場合には、行数や関数名(スレッド名)を指定して

「breakpoint」(または「b」)コマンドを実行します。

(gdb)breakpoint 18

Breakpoint 1 at 0xc88de0d5: file hello.c, line 18 (gdb)

モジュールをブレークポイントまで実行する場合には、「continue」(または「c」)コマンドを実行 します。

以下に、gdbの基本的なコマンドについて紹介します。

また、gdbで使用可能なコマンドについては、(gdb)プロンプト上で「help」を実行することで表示

されます。詳細な使用方法についてはそちらを参照してください。

コマンド  内容  短縮形 

breakpoint [line] ブレークポイントを[line]行目に設定します。

[line]の代わりに関数名(スレッド名)も使用できます。

break , b

step [num] [num]行分ステップ実行を行います。

[num]は省略可能です。(省略した場合は1行分)

s

continue モジュール(プロセス)の実行を再開します c

list [line] ソースコードのリストを表示します。

行数, 関数名等を引数にとります。

引数を省略した場合には、前回表示したlistの続きが表示されま す。

l

run [arg...] gdb起動時の引数で指 定したプログラムもしくは、「file」,

「exec-file」コマンドで設定したプログラムを実行します。1

引数には実行ファイルに渡す引数を指定できます。

r

backtrace コードのバックトレースを行います。 bac

print [symbol] [symbol]の内容を表示します。 p

clear [line] 指定した行のブレークポイントを解除します。

引数には、関数名等を指定することも可能です。

引数を省略した場合、全てのブレークポイントを解除します。2 cl

target [protcol] ターゲットプロセスやマシンを設定します。

RTLinuxのモジュールをデバッグする場合は、remoteマシンと /dev/rtf10を介して通信を行う設定でデバッグ実行を行います。

ta

kill gdbの下で動作しているプログラムのプロセスを終了させます。3

pwd 現在のWorking directoryを表示します。 pw cd [directory] Working directoryを変更します。

quit gdbを終了します。 q

1

RTLinuxモジュールの実行をrunコマンドで行った場合、モジュールの実行がgdbの制御下から はずれてしまい、breakpoint等が使用できなくなります。

2

RTLinux用にソース中に埋め込んだbreakpoint( )は解除されません。

3

RTLinuxのデバッグ中にこのコマンドを実行すると、モジュールがgdbの制御下からはずれてし まいます。

★デバッグ使用時の機能

(gdb)の端末下でコマンド入力を行う際に、以下のような機能を使用できます。

・ コマンドを省略して実行可能。

コマンドが特定可能な字数に達していれば、2, 3文字だけ入力して残りの文字を省略して実行できま す。また、使用頻度の高いコマンド(step, breakpoint 等)に関しては、「s」や「b」のように一文字で使 用することも可能です。

・ TABキーの使用

通常のコンソール端末と同じ感覚で、TABキーを使用したコマンドの補完が可能です。

・ Enterキーの使用

Enterーキーのみを入力すると、前回実行したコマンドを続けて実行します。たとえばSTEP実行を行

う場合に、最初の1回のみ「step」(「s」)コマンドを実行すれば、後はEnterキーを入力するだけでス テップ実行を繰り返し行います。

ドキュメント内 B5size manual.dot (ページ 74-79)