GDBデバッグ講座(Part1)
今回はサンプルソースを用いた、gdbによるhomebrewの実機デバッグ方法を紹介します。事前にdevkitProとGitをインストールしておいてください。
準備
git clone https://github.com/HIDE810/GDBTest.git
とコマンドプロンプトに入力し、GDBTestをクローンします。build.bat
を実行し、ciaファイルをビルドします。- ビルドしたciaファイルを、FBIなどでインストールします。
試しに一度インストールしたGDB Testerを起動してみてください。上画面に0が表示されていますか?今回はこの数値をリモートで書き換えることを目標に話を進めます。
接続手順
3DS側の操作
- ホーム画面を開いている状態でRosalina menuを開く。
- Debugger options... ⇒ Enable debuggerを選択。
- Starting debugger... OKと出るので、Bを押して戻る。(うまくいかない場合はネットワークの接続を確認)
- 同じDebugger options menu内の、Force-debug next application at launchを選択。Operation succeeded.とでたら成功。
- 先ほどインストールしたGDB Testerを起動。(ロゴ画面で停止すれば正常)
PC側の操作
- elfファイルを
gdb.bat
にドラッグアンドドロップする。 target remote ip:4003
と入力し、3DSに接続する。(ipの部分はRosalina menuの右上に表示されているipアドレスに置き換える)
この段階でin _start ()
と表示されていれば、正常に接続できています。
GDBによる操作
ここからが本題です。そもそも、なぜGDB Testerを起動したときに、上画面に0が表示されたかお分かりでしょうか?まずはソースコードから確認していきましょう。
main.cをテキストエディタなどで開いてみてください。注目するのは6行目と13行目です。
//6行目 volatile int x = 0; //13行目 printf("%d\n", x);
まず、6行目で変数xを宣言・初期化します。このとき、コンパイラの最適化が原因でgdbがエラーを吐くのを防ぐため、volatileを指定しておきます。
次に、13行目で6行目で宣言した内容を表示します。6行目では0で初期化されているため、このプログラムでは0と表示されます。
ブレークポイントの設定
ブレークポイントとは、プログラムを意図的に一時停止する箇所のことです。今回はmain関数をブレークポイントに指定します。これは、main関数に入るまでプログラムを実行するということです。main関数をブレークポイントに指定するには以下のコマンドを実行します。
b main
実行できたら、c
と入力してみてください(continueの意味)。これによりプログラムが再開され、main関数に入るまで実行されます。3DS側はロゴ表示が消えて黒い画面になるはずです。
変数の書き換え
gdbではリアルタイムで変数の書き換えが可能です。今回は変数xを書き換えて、0以外の数字を表示してみましょう。例えば、xの値を10000にするには以下のコマンドを実行します。
p x=10000
書き換えが終われば、再度c
と入力してみてください。3DSの上画面に書き換えた値が表示されていることと思います。確認できたら、スタートを押して終了します。PC側では、quit
と入力してgdbを終了してください。
最後に
今回説明したのは初歩的な部分です。もっとgdbコマンドを知りたいという方は以下を参考にしてみてください。
http://www.fos.kuis.kyoto-u.ac.jp/le2soft/siryo-html/node49.html