Panduan aplikasi CodeSite eksplorasi mendalam Delphi
Meskipun Delphi memberi kita fungsi debugging yang sangat kuat, menemukan bug masih merupakan tugas yang sulit. Biasanya waktu yang kita habiskan untuk menulis kode dan men-debug kode kira-kira sama, dan bahkan mungkin lebih. Untuk mengurangi pemborosan waktu dan tenaga yang tidak perlu, terkadang kita masih memerlukan bantuan alat debugging profesional untuk meningkatkan efisiensi penguncian bug. Pada artikel ini kami akan memperkenalkan alat debugging terkenal CodeSite PRo 2.0 (memenangkan tempat kedua dalam Penghargaan Pilihan Pembaca Informan Delphi 2000 untuk Alat Debugging Terbaik). Situs resminya adalah www.raize.com. Fungsi utama CodeSite adalah memungkinkan pengembang menggunakan kode untuk mengirimkan rincian runtime ke penerima khusus untuk analisis lebih lanjut. Lebih tepatnya melalui kelas TCodeSite yang diimplementasikan oleh CodeSite, kita dapat mengemas dan mengirimkan informasi runtime ke CodeSite Dispatcher (distributor pesan CodeSite), yang dapat mengarahkan pesan-pesan ini ke satu atau lebih penerima untuk dilihat. Penerima pesan default adalah CodeSite Viewer. Efisiensi CodeSite tercermin dalam kenyataan bahwa ini berbeda dari kotak dialog sederhana yang menampilkan pesan atau mengatur breakpoint untuk memeriksa variabel. Ini lebih mirip dengan fungsi log peristiwa (Event Log) yang disertakan dengan Delphi tidak diragukan lagi lebih kuat daripada Event Log. Ada banyak, dan pesan-pesannya berkelanjutan, yaitu dapat disimpan, yang memfasilitasi analisis retrospektif. Sebelum memperkenalkan penggunaan spesifik CodeSite, pertama-tama mari kita lihat ketiga komponennya. Objek CodeSite Seperti disebutkan sebelumnya, pengiriman pesan CodeSite dari aplikasi yang sedang berjalan dilakukan dengan menggunakan instance kelas TCodeSite (didefinisikan dalam unit CSIntf). Kita cukup memanggil metode kelas TCodeSite. Pesan tersebut dikirim ke CodeSite pengirim. Misalnya, Anda dapat menggunakan metode SendMsg objek untuk mengirim pesan string sederhana. Objek TCodeSite mengimplementasikan sejumlah besar metode untuk mendukung berbagai jenis pengiriman informasi tanpa konversi data apa pun. Misalnya, metode SendObject dari objek memiliki dua parameter: satu adalah string pesan, dan yang lainnya adalah referensi ke instance objek. . Metode ini akan memperoleh objek. Semua atribut yang dipublikasikan, dan kemudian mengemas informasi atribut tersebut ke dalam pesan CodeSite. CodeSite Dispatcher Dalam kebanyakan kasus, CodeSite Dispatcher akan berjalan dengan tenang di area baki sistem. Fungsinya hanya untuk merutekan pesan CodeSite yang dikirim dari berbagai objek TCodeSite ke tujuannya. Secara default, pesan CodeSite dikirim ke CodeSite Viewer. Kita bahkan tidak perlu memulai CodeSite Dispatcher karena ini akan dimulai secara otomatis oleh objek seperti TCodeSite. Kelas TCodeSite mendefinisikan properti DestinationDetails yang memungkinkan pengembang mengonfigurasi cara pesan CodeSite yang dikirim dirutekan oleh CodeSite Dispatcher ke tujuan berbeda, seperti file log. Namun biasanya properti ini tidak perlu diubah. CodeSite Viewer Meskipun CodeSite mendukung pengiriman pesan ke target yang berbeda, dalam banyak kasus CodeSite Viewer adalah target pengiriman utama. Bahkan ketika dikirim ke tujuan lain, seperti file log atau mesin lain, CodeSite Viewer masih menjadi alat utama untuk melihat dan menganalisis pesan. CodeSite Viewer terdiri dari empat panel berikut: daftar pesan, penampil pesan, tumpukan panggilan, dan panel Scratch. Ruang kerja utama CodeSite Viewer adalah daftar Pesan, yang digunakan untuk menampilkan semua pesan yang dikirim ke Viewer atau pesan yang dimuat dari file log. Penampil pesan digunakan untuk melihat informasi tambahan yang terkait dengan pesan. Misalnya, jika pesan saat ini dikirim dengan metode SendObject, penampil pesan akan menampilkan nilai saat ini dari semua properti objek yang dipublikasikan. Panel tumpukan panggilan menampilkan tampilan tumpukan berdasarkan pesan csmEnterMethod. Panel awal digunakan untuk menampilkan informasi yang tidak berkelanjutan. Panel Scratch sangat berguna ketika kita ingin melacak informasi tertentu tetapi tidak ingin mencatatnya dalam log pesan, seperti ketika kita ingin melihat pesan berulang dalam jumlah besar seperti posisi mouse saat ini. Saat ini kita dapat menggunakan metode WritePoint dari objek TCodeSite dan menentukan parameter Line ID untuk menentukan jumlah garis panel awal yang digunakan untuk menampung informasi mouse. Mari kita gunakan contoh sederhana untuk mendemonstrasikan cara mengirim pesan ke CodeSite Viewer dari program: (1) Buat proyek baru, lalu alihkan panel komponen ke halaman CodeSite (CodeSite akan menginstal dua komponen dalam sistem setelah instalasi TCSGlobalObject dan TCSObject). Pilih komponen TCSGlobalObject dan letakkan di formulir. Komponen TCSGlobalObject menyediakan interaksi waktu desain dengan objek TCodeSite global (TCodeSite global diinisialisasi dalam unit CSInft). (2) Tambahkan tombol, lalu tulis kode berikut di event OnClick-nya: //CodeSite adalah objek TCodeSite global CodeSite.SendMsg('CodeSite's first message'); (3) Kompilasi dan jalankan program sederhana ini. Klik tombol setelah dijalankan, dan CodeSite Dispatcher serta CodeSite Viewer akan berjalan. Pada saat yang sama, Anda akan melihat pesan yang dikirim oleh program dalam daftar pesan CodeSite Viewer (catatan: kita tidak perlu memulai CodeSite Dispatcher dan CodeSite Viewer sebelum menjalankan program, karena objek TCodeSite akan secara otomatis memulainya ketika program dijalankan. perlu mengirim pesan). Hasil yang berjalan ditunjukkan pada Gambar 4.38 di bawah ini:
(4) Selanjutnya, hentikan program dan tambahkan kode berikut dalam proses penanganan event OnClick: CodeSite.SendObject('Form1', Form1); (5) Kompilasi ulang dan jalankan program, klik tombol lagi, kali ini Anda akan melakukannya di CodeSite Viewer saya melihat dua pesan. Pesan yang terkait dengan Form1 menyertakan informasi objek Form1. (6) Untuk melihat informasi objek terkait Form1, pilih perintah menu CodeSite Viewer View|Inspector untuk menampilkan panel baru di sisi kanan daftar pesan, di mana atribut Form1 yang dipublikasikan ditampilkan, seperti yang ditunjukkan pada Gambar 4.39 di bawah ini :
(7) Hentikan program lagi, lalu ubah kode dalam proses OnClick sebagai berikut: CodeSite.EnterMethod('Button1Click'); CodeSite.SendMsg('CodeSite's first message'); ; Situs Kode .ExitMethod('Button1Click' ); (8) Kali ini ketika kita menjalankan program dan mengklik tombol, kita akan melihat bahwa pesan "Pesan pertama CodeSite" dan "Form1" diindentasi di antara pesan "Button1Click", seperti yang ditunjukkan pada Gambar 4.40 di bawah ini:
Dengan menambahkan panggilan ke metode EnterMethod dan ExitMethod, kita dapat membuat log untuk dicatat ketika metode tersebut dipanggil. Setelah melihat contohnya, kita akan menemukan bahwa fungsi CodeSite sangat kuat. Kita dapat menghasilkan informasi yang sangat rinci hanya dengan menambahkan beberapa pernyataan ke program dan menampilkannya dalam grafik yang jelas melalui CodeSite Viewer. Selanjutnya, mari kita bahas tentang teknologi aplikasi CodeSite yang canggih. Mengirim pesan ke file log Setiap program akan memiliki lebih banyak atau lebih sedikit bug. Jika tidak terjadi saat ini, maka akan terjadi pada saat itu juga. Jika tidak terjadi dalam waktu singkat, mungkin akan terjadi setelah waktu yang lama. Terkadang hal ini terjadi berulang kali, dan terkadang terjadi secara tidak sengaja. Jika seseorang memberi tahu Anda bahwa program yang dia tulis berjalan tanpa masalah kapan pun, dia berbohong. Justru karena sifat bug yang tidak disengaja dan tersembunyi, seringkali sulit bagi kami untuk mengulangi bug yang dikirimkan oleh pengguna, yang menciptakan hambatan besar bagi kami untuk men-debug program dan menemukan penyebab masalahnya, dan CodeSite dapat mengirim pesan untuk mencatat file. Hal ini memudahkan pengguna untuk melaporkan bug, karena mereka hanya perlu mengirimkan file informasi yang dihasilkan selama runtime. Sejalan dengan itu, pekerjaan kita dalam men-debug program akan menjadi lebih mudah. Kita dapat menggunakan CodeSite Viewer untuk menganalisis penyebab dan lokasi kesalahan secara intuitif. Untuk mengubah tujuan pengiriman pesan, kita dapat melakukannya dengan mengatur properti DestinationDetails pada objek TCodeSite. Fitur ini memerlukan CodeSite Dispatcher untuk diinstal pada mesin pelanggan, yang merupakan bagian CodeSite yang dapat didistribusikan secara bebas. Proses spesifik di bawah ini masih berdasarkan contoh yang disebutkan sebelumnya: (1) Tambahkan kode berikut ke event OnCreate dalam bentuk: CodeSite.DestinationDetails := 'File[Path=C:/FirstLog.csl]'; kompilasi dan jalankan program. Kali ini setelah kita mengklik tombol tersebut, pesan tidak lagi dikirim ke CodeSite Viewer tetapi ke file FirstLog.csl di drive C. (3) Gunakan CodeSite Viewer untuk memuat file FirstLog.csl Kali ini kita melihat pesan CodeSite yang disimpan seperti sebelumnya. (4) Jika kita ingin mengirim pesan ke CodeSite Viewer dan mencatat file secara bersamaan, cukup ubah kode sebelumnya menjadi: CodeSite.DestinationDetails := 'Viewer,File[Path=C:/FirstLog.csl]'; -Data yang disesuaikan Meskipun kelas TCodeSite menyediakan sejumlah besar metode untuk memproses tipe data yang berbeda, terkadang kami mungkin perlu mengirimkan informasi data dalam format khusus tertentu. Untuk tujuan ini, kelas TCodeSite mendefinisikan metode SendCustomData, yang mendukung pengiriman tipe data apa pun dan memformat data sesuai dengan pemformat khusus sehingga CodeSite Viewer dapat menampilkan data dengan benar. Pertama kita perlu membuat subkelas objek TCSFormatter, lalu membebani metode FormatData, InspectorType, dan TypeName objek tersebut. Kemudian panggil objek pengelola objek CodeSite CSObjectManager untuk mendaftarkan subkelas TCSFormatter yang baru. Selain itu, kita juga perlu memanggil metode RegisterCustomFormat untuk mendaftarkan jenis pesan baru. Berikut ini adalah contoh penerapan praktis. Pemformat khusus jenis catatan TCSEmployeeRecord diterapkan di unit CSEmployee.pas: unit CSEmployee; antarmuka menggunakan Windows, Grafik, CSIntf; , di bagian Penggunaan menambahkan referensi ke unit CSIntf. Langkah kedua adalah mendefinisikan konstanta tipe pesan CodeSite baru untuk setiap formatter. Di atas kita mendefinisikan dua konstanta harus lebih besar dari csmUser, tetapi tidak lebih besar dari 32.000. ketik TCSEmployee = catatan Nama Belakang: string; Nama Depan: string; Alamat: string; Kota: string; Negara: string; Nomor Telepon: string; Boolean; end; Catatan di atas adalah tipe data khusus yang ingin kami kirim. TCSEmployeeSummaryFormatter = kelas( TCSFormatter ) fungsi publik InspectorType: TCSInspectorType; override; function TypeName: string override; Di atas adalah definisi dari dua kelas pemformat khusus. Pemformat pertama akan memformat data TCSEmployee ke dalam format teks, dan pemformat kedua akan memformat data TCSEmployee ke dalam gaya kisi. implementasi menggunakan SysUtils {============} {= = Metode TCSEmployeeSummaryFormatter ==} {=============} fungsi TCSEmployeeSummaryFormatter .InspectorType: TCSInspectorType; mulai Hasil := itStockStringList akhir; Langkah pertama dalam mengimplementasikan pemformat khusus adalah menentukan tipe penampil bawaan mana yang akan digunakan untuk melihat data yang diformat. Dalam hal ini, penampil daftar string digunakan. Jenis penampil akan digunakan oleh metode FormatData. prosedur TCSEmployeeSummaryFormatter.FormatData( var Data ); var EmpRec: TCSEmployee; mulai Karyawan := TCSEmployee( Data ); ', '+EmpRec.State+' '+ EmpRec.ZipCode ); AddLine( '' ); AddLine( 'Telepon: ' + EmpRec.PhoneNumber ); m', [ Gaji Karyawan ] ) ); AddLine( '' ); ' + IntToStr( EmpRec.VacationDays ) ); AddLine( 'Hari Sakit: ' + IntToStr( EmpRec.SickDays ) ); jika EmpRec.Manager maka AddLine( 'Manajer: Ya' ) else AddLine( 'Manajer: Tidak' ); ; Metode FormatData adalah bagian inti. Perhatikan bahwa parameter Data yang diteruskan ke metode FormatData adalah parameter variabel yang tidak diketik. Artinya, parameter ini dapat berupa tipe data apa pun. Melalui proses registrasi format, kami dapat memastikan bahwa tipe yang dipaksakan dipetakan ke rekaman data khusus tanpa kesalahan konversi. Setelah mengonversi tipe data, kita dapat memformat data. Di sini kita menggunakan metode AddLine dari kelas dasar TCSFormatter untuk menambahkan garis pemisah antar string untuk pemformatan. function TCSEmployeeSummaryFormatter.TypeName: string;begin Hasil := 'TCSEmployee'; Kelebihan metode TypeName adalah opsional, tetapi biasanya kita dapat menggunakannya untuk mengembalikan string yang muncul di daftar pesan. {============} {== Metode TCSEmployeeDetailsFormatter == } {============} fungsi TCSEmployeeDetailsFormatter.InspectorType: TCSInspectorType ; mulai Hasil := itStockGrid akhir; Untuk pemformat detail karyawan, penampil kisi bernama akan digunakan untuk melihat data: procedure TCSEmployeeDetailsFormatter.FormatData( var Data ); var EmpRec: TCSEmployee; start EmpRec := TCSEmployee( Data ); ;AddNameValuePair( 'Nama Depan', EmpRec.Nama Depan ); AddNameValuePair( 'Alamat', EmpRec.Address ); AddNameValuePair( 'Kota', EmpRec.City ); AddNameValuePair( 'Negara Bagian', EmpRec.State ); EmpRec.Nomor Telepon );TambahkanNamaValuePair( 'HireDate', EmpRec.HireDate ); AddNameValuePair( 'VacationDays', EmpRec.VacationDays ); );TambahkanNamaValuePair('Manajer', EmpRec.Manager ); end; Di sini untuk memformat data di penampil grid, kami menggunakan metode AddNameValuePair. function TCSEmployeeDetailsFormatter.TypeName: string; mulai Hasil := 'TCSEmployee'; akhir; Dua prosedur berikut digunakan untuk merangkum panggilan ke metode SendCustomData Di sini, instance objek TCodeSite global disebut: {===== == =============} {== Metode Dukungan ==} {========} procedure CSSendEmployeeSummary ( const Pesan: tali; EmpRec: TCSEmployee ); mulai CodeSite.SendCustomData( csmEmployeeSummary, Msg, EmpRec ); akhir; prosedur CSSendEmployeeDetails( const Msg: string; EmpRec: TCSEmployee ); Terakhir, jangan lupa memanggil metode CSObjectManager.RegisterCustomFormatter untuk mendaftarkan formatter ke CodeSite Object Manager. inisialisasi CSObjectManager.RegisterCustomFormatter( csmEmployeeSummary, TCSEmployeeSummaryFormatter ); CSObjectManager.RegisterCustomFormatter( csmEmployeeDetails, TCSEmployeeDetailsFormatter );