3DS研究所

homebrew・CFW全般

GDBデバッグ講座(Part1)

今回はサンプルソースを用いた、gdbによるhomebrewの実機デバッグ方法を紹介します。事前にdevkitProGitをインストールしておいてください。

準備

  1. git clone https://github.com/HIDE810/GDBTest.gitコマンドプロンプトに入力し、GDBTestをクローンします。
  2. build.batを実行し、ciaファイルをビルドします。
  3. ビルドしたciaファイルを、FBIなどでインストールします。

試しに一度インストールしたGDB Testerを起動してみてください。上画面に0が表示されていますか?今回はこの数値をリモートで書き換えることを目標に話を進めます。

接続手順

3DS側の操作

  1. ホーム画面を開いている状態でRosalina menuを開く。
  2. Debugger options... ⇒ Enable debuggerを選択。
  3. Starting debugger... OKと出るので、Bを押して戻る。(うまくいかない場合はネットワークの接続を確認)
  4. 同じDebugger options menu内の、Force-debug next application at launchを選択。Operation succeeded.とでたら成功。
  5. 先ほどインストールしたGDB Testerを起動。(ロゴ画面で停止すれば正常)

PC側の操作

  1. elfファイルをgdb.batドラッグアンドドロップする。
  2. 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