* OSECPUのデバッグモニタ
-(by [[K]], 2013.07.31)
** (0) はじめに
-OSECPUはセキュリティ例外を起こすか、もしくは正常終了したタイミングで、デバッグモニタに入ることができます。
-これを使うと、ソース上の何行目でセキュリティ例外を起こしたのか、その時のレジスタ値を確認することができます。

** (1) 起動オプション
-OSECPUでアプリを起動する際に、末尾に次のようなオプションを付けてください。
 prompt>osecpu app????.ose dbgr:1
-なお、アプリを作る際にリリースモードにしていると、行番号表示は0になって正確ではなくなりますが、それ以外の表示はリリースモードでも同じ結果が得られます。

** (2) モニタコマンド
-R01レジスタの表示
 dbgr>p R01
-P02レジスタの表示
 dbgr>p P02
-モニタの終了
 dbgr>q

** (3) 例
-こんなプログラムを作ってやってみましょう。
 #include "osecpu_ask.h"
 SInt32 i:R00;
 VPtr p:P01;
 junkApi_malloc(p, T_UINT8, 100);
 for (i = 0; i != 1000; i++) {
     PASMEM0(i, T_UINT8, p, i);
     PASMEM0(i, T_UINT8, p, i);  // p[i] = i;
 }
-「dbgr:1」を付けて起動するとこうなります。
 prompt>osecpu app0074.ose dbgr:1
 security error! abort...
 debugInfo0=6, debugInfo1=1
 
 dbgr>
-debugInfo0が6なので6行目の PASMEM0(i, T_UINT8, p, i); でセキュリティ例外が発生したことが分かります。

-ではこのときのP01を確認してみます。
 dbgr>p P01
 P01:
   type = T_UINT8(0003),  (origin-ptr) = 0x00386650
   size = 0x00000064 = 100
   pos  = 0x00000000 = 0
-これはつまり、P01は要素数100個の配列の先頭(pos=0)を指していて、型はT_UINT8だと分かります。

-同様にR00を確認してみます。
 dbgr>p R00
 R00 = 0x00000064 = 100
-ということなので、i=100になって、配列からはみ出してセキュリティ例外になったことが分かります。

** (4) 補足
-というか、debugInfo0の表示は、「dbgr:1」を付けてなくても普通に見れます。デバッグモニタが嬉しいのは、レジスタの値を確認できることだけです。

* こめんと欄
#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS