* 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