Debuging dengan Symbol Server

Soeleman 25 Agustus 2017

Debuging dengan Symbol Server

Dalam pembuatan atau pemeliharaan software, kebanyakan kita menggunakan library atau komponen yang di buat oleh pihak ketiga. Kadang kita mendapatkan error atau bug yang membuat aplikasi kita tidak berjalan semestinya. Untuk mencari tahu bug tersebut kadang perlukan men-debug ke dalam library tersebut. Apakah itu di mungkinkan?

Debug Symbol

Ketika debugger melakukan perkerjaannya, ia memerlukan debug symbol sebagai bahan untuk melakukan breakpoint. Debug symbol ini di buat dan simpan dalam program database (PDB) file, ketika mem-build program kita. Dengan adanya debug symbol ini maka debugger akan membantu kita melakukan linking antara binary dengan source code yang ada.

Kalau kita ingin melakukan debug terhadap Common Language Infrastructure (CLI) atau lebih umum di sebut Base Class Library (BCL) dari .NET, di visual studio sudah ada fitur untuk itu. Dengan menggunakan symbol server, kita akan bisa melihat ke dalam class-class yang di bundle dalam .NET Contoh-nya kalau kita ingin melihat apa yang ada di code Console.WriteLine dengan debugger.

Bagaimana mungkin? Sederhana saja, debug symbol untuk BCL sudah di generated PDB-nya dan di simpan pada symbol server. Jadi ketika debugger membutuhkan debug symbol dari BCL, symbol server akan memberikannya pada debugger.

dotPeek

Oleh karena symbol server hanya menyimpan PDB dari BCL. Maka untuk library di luar itu kita harus memiliki PDB dari library tersebut dan tentu saja symbol server yang men-serve permintaan dari debugger ketika memerlukan debug symbol dari target library-nya.

Untuk itu kita memerlukan tool untuk membantu kita meng-generated PDB dan bertindak sebagai local symbol server. Untung saja sejak dotPeek versi 1.2 ada fitur yang bisa kita gunakan untuk itu. JetBrains dotPeek merupakan tool untuk melakukan decompiler terhadap [Common Intermediate Language (CIL)][]. Sekarang kita akan melihat bagaimana bekerja dengan dotPeek sebagai local symbol server.

Demo Aplikasi

Untuk mempermudah penjelasan dari tulisan ini. Kita akan buat aplikasi Console yang akan di debug dengan local symbol server. Karena kita akan menggunakan entity framework, maka gunakan nuget untuk mendapatkan library tersebut. Juga kita menambahkan beberapa class seperti dibawah.

Class Blog merupakan class yang akan di gunakan sebagai entity pada entity framework.

< VB.NET >

alt text

< C# >

alt text

Class BlogContext sebagai DbContext dari entity framework.

< VB.NET >

alt text

< C# >

alt text

Method Main ini merupakan method yang akan kita debug.

< VB.NET >

alt text

< C# >

alt text

Konfigurasi dotPeek

Untuk menjadikan dotPeek sebagai local symbol server. Kita perlu melakukan konfigurasi agar bisa bekerja sebagaimana yang kita harapkan.

alt text

Setting ini perlu di lakukan agar kita me-limit assembly tertentu saja. Dengan begitu kita bisa lebih fokus dan tidak men-guras banyak resource komputer developement.

alt text

Setelah kita setting seperti di atas. Kita akan membersihkan assembly yang tidak kita inginkan. Di Assembly Explorer kita clear-kan seperti digambar.

alt text

Karena kita ingin men-debug entity framework library. Kita menambahkan library yang ada di dalam folder Package yang ada di dalam folder solution. Library yang kita tambahkan adalah EntityFramework.dll dan EntityFramework.SqlServer.dll .

Dan kita perlu men-generated PDB, karena dalam nuget package-nya tidak di sertakan. Caranya click kanan atau tekan button pdb, pada saat meng-highlight library EntityFramework.SqlServer.dll.

alt text

Pada pop-up windows kita isi sesuai yang di minta. Kalau bisa Destination folder-nya, di buat sesingkat mungkin agar path-nya tidak terlalu panjang. Ingat banyak library yang panjang namanya, sedangkan windows MAX_PATH-nya hanya 260 karakter.

alt text

Apabila kita sukses meng-generated PDB-nya. Kita bisa melihat log-nya, seperti di gambar. Juga kita juga akan melihat di window explorer kita melihat PDB file per-assembly.

alt text

Kadang tidak semua assembly bisa di generated PDB-nya. Tergantung level security yang di apply pada assembly itu. Obfuscation juga akan berpengaruh terhadap kesuksesan meng-generated PDB.

Untuk menjalankan local symbol server dengan dotPeek ini. Cukup tekan button Start Symbol Server.

alt text

Apabila sukses, maka kita melihat icon-nya berganti seperti pada gambar.

alt text

Konfigurasi Visual Studio

Sekarang kita perlu memberitahukan kepada visual studio di mana local symbol server-nya. Di Options » Debugging » Symbols.

alt text

Kita menambahkan local symbol server yang beralamat http://localhost:33417/ . Seperti yang ada pada dotPeek options.

alt text

Debug

Pasang breakpoint pada ctx.SaveChanges() agar kita bisa melihat bagaimana bekerja dengan local symbol server. Jalankan debug mode dengan F5.

Debugger akan berhenti di-breakpoint yang sudah ditentukan. Karena kita akan melihat kedalam method SaveChanges, maka gunakan Step-Into atau F11.

< VB.NET >

alt text

< C# >

alt text

Kalau kita tidak memiliki PDB maka debugger akan melewati Step-Into atau F11 tadi ke line code berikutnya seperti pada gambar dibawah.

< VB.NET >

alt text

< C# >

alt text

Dengan Step-Into atau F11, kita berada di dalam class DbContext.cs. Seakan-akan kita mempunyai source code-nya dalam project kita, yang kita tahu itu berasal dari generated PDB. Kalau di perhatikan, dotPeek-nya hanya men-generated C# kode. Jadi pada saat diproject VB.NET-pun kita akan mendapatkan C# kode ketika men-debug dengan local symbol server. Juga untuk assembly yang sudah ter-Obfuscation, kita akan mendapatkan generated PDB yang ter-acak juga terutama penamaan dari internal class.

< VB.NET >

alt text

< C# >

alt text

Dari DbContext, kita bisa masuk lebih dalam lagi dengan Step-Into atau F11. Dan kita akan mendapati bahwa this.InternalContext.SaveChanges() merupakan class LazyInternalContext dan seterus-nya.

< VB.NET >

alt text

< C# >

alt text

Penutup

Dengan bantuan dotPeek, kita bisa men-generated PDB dan menjadikannya sebagai local symbol server yang compatible dengan visual studio. Walaupun saat ini dotPeek hanya bisa meng-generated C# kode saja, itu sudah banyak membantu men-debug lebih lanjut.

Referensi

Perhatian! Code yang ditampilkan dalam tulisan ini merupakan ilustrasi dari yang ingin dipaparkan dan bukan production ready code. Sudah banyak kejadian karena asal meng-copy-and-paste tanpa mengerti code yang diambil itu ke dalam production. Selain itu perlu ada tambahan code dan test sebelum siap untuk digunakan secara utuh.