0
0
0
share
#.NET#.NET#csharp#csharp
0 Komentar
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 >
< C# >
Class BlogContext sebagai DbContext dari entity framework.
< VB.NET >
< C# >
Method Main ini merupakan method yang akan kita debug.
< VB.NET >
< C# >
Konfigurasi dotPeek
Untuk menjadikan dotPeek sebagai local symbol server. Kita perlu melakukan konfigurasi agar bisa bekerja sebagaimana yang kita harapkan.
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.
Setelah kita setting seperti di atas. Kita akan membersihkan assembly yang tidak kita inginkan. Di Assembly Explorer kita clear-kan seperti digambar.
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.
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.
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.
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.
Apabila sukses, maka kita melihat icon-nya berganti seperti pada gambar.
Konfigurasi Visual Studio
Sekarang kita perlu memberitahukan kepada visual studio di mana local symbol server-nya. Di Options » Debugging » Symbols.
Kita menambahkan local symbol server yang beralamat http://localhost:33417/ . Seperti yang ada pada dotPeek options.
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 >
< C# >
Kalau kita tidak memiliki PDB maka debugger akan melewati Step-Into atau F11 tadi ke line code berikutnya seperti pada gambar dibawah.
< VB.NET >
< C# >
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 >
< C# >
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 >
< C# >
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
- JetBrains dotPeek
- Wikipedia: Obfuscation
- Wikipedia: Program database (PDB)
- Wikipedia: Debug Symbol
- Wikipedia: Common Language Infrastructure (CLI)
- Wikipedia: Decompiler
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.
0
0
0
share