jump to navigation

Pengaruh Garbage Collector dalam Proses Debugging – Bagian 02 21 Mei 2008

Posted by firstyuyu in Garbage Collector.
trackback

Ketika JIT compiler meng-compile sebuah method, ia akan memeriksa apakah assembly tempat method tersebut berada mempunyai atribut System.Diagnostic.DebuggableAttribute dan parameter isJITOptimizerDisabled pada konstruktornya diset dengan nilai true. Jika ya, maka ia akan menambah masa hidup semua variabel lokal hingga akhir method. Ketika kita menambahkan compiler option
/debug+, compiler C# akan menambahkan atribut tersebut pada assembly yang dihasilkan. Perhatikan, compiler option
/optimize+ akan mengaktifkan optimisasi sehingga jangan menggunakannya pada percobaan ini.

JIT compiler melakukan ini semua untuk membantu kita ketika melakukan just-in-time debugging. Kita bisa menjalankan aplikasi tadi secara normal (tanpa debuggeri), dan ketika method tersebut dipanggil, JIT compiler akan menambah masa hidup variabel hingga akhir method. Kemudian, jika kita ingin meng-attach
debugger ke aplikasi yang sedang kita jalankan tersebut, kita bisa meletakkan sebuah breakpoint dan memeriksan nilai variabel yang ada.

Sekarang kita mengetahui bagaimana kita bisa membuat sebuah program yang berjalan normal dalam debug build dan tidak berjalan sebagaimana diharapkan dalam release build. Karena tidak ada developer yang menginginkan sebuah program yang hanya berjalan normal ketika di-debug, maka harus ada yang kita lakukan agar program tersebut berjalan normal tanpa memperdulikan jenis build yang kita lakukan.

Kita bisa mencoba memodifikasi method Main seperti berikut:

public static void Main()
{
    // Buat obyek Timer yang akan mengeksekusi
    // method TimerCallback setiap 2000 milisecond
    Timer t = new Timer(TimerCallback, null, 0, 2000);
    // Tunggu penekanan enter.
    Console.ReadLine();
    // Akses variabel t
    t = null;
} 

Namun, jika kita meng-compile kode di atas tanpa compiler option /debug+ lalu menjalankan (tanpa debugger) file exe yang dihasilkan, kita akan bisa melihat bahwa method TimerCallback masih tetap dipanggil hanya sekali. Masalahnya di sini adalah JIT compiler merupakan compiler yang cukup pintar. Mengeset sebuah variabel lokal dengan nilai null adalah sama saja dengan tidak mengaksesnya sama sekali. Dengan kata lain, JIT compiler telah melakukan optimasi dengan membuang baris t = null; dari kode program. Karena itulah program tersebut masih belum berjalan sebagaimana kita harapkan. Cara yang benar untuk memodifikasai method Main adalah sbb:

public static void Main()
{
    // Buat obyek Timer yang akan mengeksekusi
    // method TimerCallback setiap 2000 milisecond
    Timer t = new Timer(TimerCallback, null, 0, 2000);
    // Tunggu penekanan enter.
    Console.ReadLine();
    // Akses variabel t (variabel t akan selamat
    // dari garbage collector hingga method
    // Dispose selesai dipanggil)
    t.Dispose();
} 

Sekarang, jika kita compile kode di atas (tanpa pilihan /debug+) lalu menjalankan (tanpa debugger) file exe yang dihasilkan, kita akan bisa melihat bahwa method TimerCallback akan dipanggil setiap 2000 milisecond. Inilah yang kita harapkan. Yang terjadi di sini adalah obyek yang ditunjuk oleh variabel t harus masih tetap hidup agar method Dispose bisa dipanggil. Karena itulah obyek Timer yang ditunjuk oleh variabel t selamat dari garbage collector yang berjalan sebelum method Dispose.

 

<< Bagian 01 <<

Komentar»

No comments yet — be the first.

Tinggalkan komentar