ページ 1 / 1
デバッグ実行中の中断
Posted: 2005年12月10日(土) 22:55
by Toshi
デバッグ実行中に Debug 命令語でプログラムを停止させ、
そこで [中断] をクリックするとプログラムがすぐに終了しますが、
その時にプログラムで使用しているハンドルやオブジェクトは解放されているんでしょうか?
また例外処理が発生した場合の [閉じる] も同じです。
もし解放されていない場合はリークになると思うのですが...
Posted: 2005年12月11日(日) 06:08
by konisi
試していませんが、中断を選んだ場合は開放されていると思います。
例外処理のときは開放されるかどうかなんて分りません。なんせ中途で勝手に止まっちまうもんですから。
なんて言ってられないので試してみました。
場合:Debug中に中断する
方法:タスクマネージャより監視する
結果:開放された
結果:開放された
結果:開放された
さて、debugの途中で開放されるかどうかは実証できますがどうやって例外処理起こすか・・・。
Posted: 2005年12月11日(日) 08:31
by マティ
[AB4のみ調査]
ActiveBasicのデバッガは、実行プログラム(マシン語)を直接デバッグします。
(中間コードなどによるエミュレーションではありません。)
デバッグ実行を行うと、debug命令はint 3というデバッグ割り込み命令になります。
実行プログラム内でint 3を実行、または例外処理が発生すると、デバッガーに処理が移ります。
[中断] をクリックすると、全てのデバッグ情報と供に、実行モジュールも開放します。
実行モジュールで確保したリソースの開放は(基本的に)OSが行いますので、NT系のOSでは心配する必要は無いと思います。
重要メモリーを操作する実行プログラムでは、ABのシステムコードを破壊する場合があります。
その際は、正常に動作しなくなるのでご注意ください。
原因としては、
・配列の上限を超える領域までデータを書き込む。
・ポインター操作を誤る。
・バッファーの領域が不足していた。
等があります。
返信@yu0627
Posted: 2005年12月11日(日) 10:05
by yu0627
さて、debugの途中で開放されるかどうかは実証できますがどうやって例外処理起こすか・・・。
少々ずれていますが投稿させて頂きます。
例外処理の起こし方としては、WinXPなら、「Server」「WorkStation」どちらかのサービスが
停止していれば起こると思います。一度実験したことがあるので。
僕の環境の場合、
Computer Browser:起動 Server:起動 WorkStation:起動→例外処理なし
Computer Browser:停止 Server:起動 WorkStation:起動→例外処理なし
Computer Browser:停止 Server:起動 WorkStation:停止→例外処理:6B5
Computer Browser:停止 Server:停止 WorkStation:起動→例外処理:6B5
Computer Browser:停止 Server:停止 WorkStation:停止→例外処理:6B5
このようになっております。
環境:
SOTEC PCSTATION SX7170C
AMD AthlonXP 1700+
384MB(256MB+128MB)
HDD:40GB
NVIDIA GeForce FX 5200 128MB
参考程度に。では。
Posted: 2005年12月11日(日) 13:26
by イグトランス
> さて、debugの途中で開放されるかどうかは実証できますがどうやって例外処理起こすか・・・。
ずばりRaiseExceptionという名前の通り例外を起こす関数があります。
C++などの言語に備えられている例外処理などに使われているようです。
コード: 全て選択
Declare Sub RaiseException Lib "kernel32.dll" (
dwExceptionCode As DWord,
dwExceptionFlags As DWord,
nNumberOfArguments As DWord,
lpArguments As *ULONG_PTR)
RaiseException(0, 0, 0, NULL)
Posted: 2005年12月12日(月) 19:16
by Toshi
解放はされているんですね。疑問が解決しました。
ありがとうございました。