デバッグ実行中に Debug 命令語でプログラムを停止させ、
そこで [中断] をクリックするとプログラムがすぐに終了しますが、
その時にプログラムで使用しているハンドルやオブジェクトは解放されているんでしょうか?
また例外処理が発生した場合の [閉じる] も同じです。
もし解放されていない場合はリークになると思うのですが...
デバッグ実行中の中断
試していませんが、中断を選んだ場合は開放されていると思います。
例外処理のときは開放されるかどうかなんて分りません。なんせ中途で勝手に止まっちまうもんですから。
なんて言ってられないので試してみました。
場合:Debug中に中断する
方法:タスクマネージャより監視する
さて、debugの途中で開放されるかどうかは実証できますがどうやって例外処理起こすか・・・。
例外処理のときは開放されるかどうかなんて分りません。なんせ中途で勝手に止まっちまうもんですから。
なんて言ってられないので試してみました。
場合:Debug中に中断する
方法:タスクマネージャより監視する
使用したコード1 [ここをクリックすると内容が表示されます]
結果:開放された
コード: 全て選択
Dim A(1000000) As Double
Dim B(1000000) As Long
Dim C(1000000) As Word
Dim D(1000000) As DWord
Dim E(1000000) As Byte
debug
使用したコード2 [ここをクリックすると内容が表示されます]
結果:開放された
コード: 全て選択
Dim A As VoidPtr
A=calloc(10000000)
debug
使用したコード3 [ここをクリックすると内容が表示されます]
結果:開放されたコード: 全て選択
Dim hPen As HPEN
Dim hDC As HDC
hDC=GetDC(GetDesktopWindow())
hPen=CreatePen(PS_SOLID,1,RGB(0,0,0))
SelectObject(hDC,hPen)
SelectObject(hDC,GetStockObject(NULL_BRUSH))
debug
さて、debugの途中で開放されるかどうかは実証できますがどうやって例外処理起こすか・・・。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
[AB4のみ調査]
ActiveBasicのデバッガは、実行プログラム(マシン語)を直接デバッグします。
(中間コードなどによるエミュレーションではありません。)
デバッグ実行を行うと、debug命令はint 3というデバッグ割り込み命令になります。
実行プログラム内でint 3を実行、または例外処理が発生すると、デバッガーに処理が移ります。
[中断] をクリックすると、全てのデバッグ情報と供に、実行モジュールも開放します。
実行モジュールで確保したリソースの開放は(基本的に)OSが行いますので、NT系のOSでは心配する必要は無いと思います。
重要メモリーを操作する実行プログラムでは、ABのシステムコードを破壊する場合があります。
その際は、正常に動作しなくなるのでご注意ください。
原因としては、
・配列の上限を超える領域までデータを書き込む。
・ポインター操作を誤る。
・バッファーの領域が不足していた。
等があります。
ActiveBasicのデバッガは、実行プログラム(マシン語)を直接デバッグします。
(中間コードなどによるエミュレーションではありません。)
デバッグ実行を行うと、debug命令はint 3というデバッグ割り込み命令になります。
実行プログラム内でint 3を実行、または例外処理が発生すると、デバッガーに処理が移ります。
[中断] をクリックすると、全てのデバッグ情報と供に、実行モジュールも開放します。
実行モジュールで確保したリソースの開放は(基本的に)OSが行いますので、NT系のOSでは心配する必要は無いと思います。
重要メモリーを操作する実行プログラムでは、ABのシステムコードを破壊する場合があります。
その際は、正常に動作しなくなるのでご注意ください。
原因としては、
・配列の上限を超える領域までデータを書き込む。
・ポインター操作を誤る。
・バッファーの領域が不足していた。
等があります。
返信@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
参考程度に。では。
> さて、debugの途中で開放されるかどうかは実証できますがどうやって例外処理起こすか・・・。
ずばりRaiseExceptionという名前の通り例外を起こす関数があります。
C++などの言語に備えられている例外処理などに使われているようです。
ずばり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)