Kusnassriyanto's Blog

Wednesday, October 12, 2005

Abort di BeforePost mengakibatkan Access Violation

Barusan seorang teman bertanya : "Kenapa pemanggilan Abort dalam event BeforePost-nya ClientDataset mengakibatkan Access Violation ... ?"
Dalam event BeforePost ini dilakukan pengecekan data. Bila data salah maka ditampilkan message dan agar post tidak terjadi maka dipanggil proceduer Abort. Logikanya sih memang seperti itu. Tapi agar saya yakin semua dikerjakan dengan benar, saya periksa programnya. Ternyata programnya bersih. Kode dalam Event BeforePost ditulis seperti seharusnya. Tapi kenapa muncul Access Violation ?
Seperti biasa, kalo saya ingin men-debug sampai ke dalam VCL, saya aktifkan Use Debug Dcus pada Project Option. Kemudian saya lakukan debugging, pasang break point di sana sini. Jalankan program, kemudian di-debug sampai ke dalam VCL. Berkali-kali menekan tombol F7 dan F8 kok Access Violation tidak muncul-muncul sampai selesai. Semua break point saya bersihkan. Saya jalankan lagi, ternyata Access Violation tidak muncul.
Kemudian option Use Debug Dcus saya uncheck. Ternyata muncul lagi Access Violation. Berarti dapat disimpulkan terdapat inkonsistensi antara SysUtils.dcu yang ada di Lib dengan yang ada di Lib\Debug. Wah kaco borland nih. Saya periksa isi procedure Abort.

procedure Abort;

function ReturnAddr: Pointer;
asm
MOV EAX,[EBP + 4]
end;

begin
raise EAbort.CreateRes(@SOperationAborted) at ReturnAddr;
end;


Dugaan saya ada masalah dengan function ReturnAddr diatas. Untuk menguji hipotesa saya ini, saya ganti pemanggilan Abort dengan

raise EAbort.Create('');

Saya uncheck Use Debug Dcus, saya jalankan program, dan ternyata program bisa berjalan dengan baik. Berarti dugaan saya benar.
Kenapa ya dengan ReturnAddr ?
Komputer teman saya adalah Windows XP dengan Delphi 7.
Di komputer saya (Win 2000), selama ini saya tidak pernah mengalami hal seperti ini.