* 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