Penelusuran kesalahan dalam Mode Sumber
Men-debug aplikasi lebih mudah jika Anda dapat menganalisis sumber kode, alih-alih biner yang dibongkar.
WinDbg, CDB, dan KD dapat menggunakan kode sumber dalam penelusuran kesalahan, jika bahasa sumbernya adalah C, C++, atau assembly.
Persyaratan Kompilasi
Untuk menggunakan penelusuran kesalahan sumber, Anda harus membuat file simbol compiler atau linker (file.pdb) saat biner dibuat. File simbol ini menunjukkan debugger bagaimana instruksi biner sesuai dengan baris sumber.
Selain itu, debugger harus dapat mengakses file sumber aktual , karena file simbol tidak berisi teks sumber yang sebenarnya.
Jika memungkinkan, pengkompilasi dan linker tidak boleh mengoptimalkan kode Anda. Penelusuran kesalahan sumber dan akses ke variabel lokal lebih sulit, dan kadang-kadang hampir tidak mungkin, jika kode telah dioptimalkan. Jika Anda menggunakan utilitas Build sebagai pengkompilasi dan pengtaut, atur makro MSC_OPTIMIZATION ke /Od /Oi untuk menghindari pengoptimalan.
Menemukan File Simbol dan File Sumber
Untuk men-debug dalam mode sumber, debugger harus dapat menemukan file sumber dan file simbol. Untuk informasi selengkapnya, lihat Jalur sumber.
Penelusuran Kesalahan Sumber Awal
Debugger dapat menampilkan informasi sumber setiap kali memiliki simbol dan file sumber yang tepat untuk utas yang saat ini sedang di-debug.
Jika Anda memulai aplikasi mode pengguna baru dengan menggunakan debugger, jeda awal terjadi saat Ntdll.dll memuat aplikasi. Karena debugger tidak memiliki akses ke file sumber Ntdll.dll, Anda tidak dapat mengakses informasi sumber untuk aplikasi Anda pada saat ini.
Untuk memindahkan penghitung program ke awal aplikasi, tambahkan titik henti di titik masuk ke biner Anda. Di jendela Perintah Debugger, ketik perintah berikut.
bp main
g
Aplikasi kemudian dimuat dan berhenti ketika fungsi utama dimasukkan. (Tentu saja, Anda dapat menggunakan titik masuk apa pun, tidak hanya utama.)
Jika aplikasi melempar pengecualian, aplikasi akan masuk ke debugger. Informasi sumber tersedia pada saat ini. Namun, jika Anda mengeluarkan jeda dengan menggunakan CTRL+C, CTRL+BREAK, atau Debug | Putuskan perintah, debugger membuat utas baru, sehingga Anda tidak dapat melihat kode sumber Anda.
Setelah mencapai utas yang file sumbernya Anda miliki, Anda dapat menggunakan jendela Perintah Debugger untuk menjalankan perintah penelusuran kesalahan sumber. Jika Anda menggunakan WinDbg, jendela Sumber akan muncul. Jika Anda telah membuka jendela Sumber dengan mengklik File Sumber Terbuka pada menu File , WinDbg biasanya membuat jendela baru untuk sumbernya. Anda dapat menutup jendela sebelumnya tanpa memengaruhi proses penelusuran kesalahan.
Debugging Sumber di GUI WinDbg
Jika Anda menggunakan WinDbg, jendela Sumber muncul segera setelah penghitung program berada dalam kode tempat debugger memiliki informasi sumber.
WinDbg menampilkan satu jendela Sumber untuk setiap file sumber yang Anda atau WinDbg buka. Untuk informasi selengkapnya tentang properti teks jendela ini, lihat Windows Sumber.
Anda kemudian dapat menelusuri aplikasi Anda atau menjalankan ke titik henti atau ke kursor. Untuk informasi selengkapnya tentang perintah langkah dan pelacakan, lihat Mengontrol Target.
Jika Anda berada dalam mode sumber, jendela Sumber yang sesuai berpindah ke latar depan saat Anda menelusuri aplikasi Anda. Karena ada juga rutinitas Microsoft Windows yang dipanggil selama eksekusi aplikasi, debugger mungkin memindahkan jendela Disassembly ke latar depan ketika panggilan semacam ini terjadi (karena debugger tidak memiliki akses ke sumber untuk fungsi-fungsi ini). Ketika penghitung program kembali ke file sumber yang diketahui, jendela Sumber yang sesuai menjadi aktif.
Saat Anda menelusuri aplikasi, WinDbg menyoroti lokasi Anda di jendela Sumber dan jendela Pembbongkaran. Garis di mana titik henti diatur juga disorot. Kode sumber diwarnai sesuai dengan penguraian bahasa. Jika jendela Sumber telah dipilih, Anda dapat mengarahkan kursor ke simbol dengan mouse untuk mengevaluasinya. Untuk informasi selengkapnya tentang fitur-fitur ini dan cara mengontrolnya, lihat Windows Sumber.
Untuk mengaktifkan mode sumber di WinDbg, gunakan perintah l+t , klik mode sumber pada menu debug , atau klik tombol mode sumber pada . Saat mode sumber aktif, indikator ASM tampak tidak tersedia pada bilah status.
Anda dapat melihat atau mengubah nilai variabel lokal apa pun saat Menelusuri fungsi dalam mode sumber. Untuk informasi selengkapnya, lihat Membaca dan Menulis Memori.
Debugging Sumber di Jendela Perintah Debugger
Jika Anda menggunakan CDB, Anda tidak memiliki jendela Sumber terpisah. Namun, Anda masih dapat melihat kemajuan saat menelusuri sumbernya.
Sebelum Anda dapat melakukan penelusuran kesalahan sumber di CDB, Anda harus memuat simbol baris sumber dengan mengeluarkan perintah .lines (Toggle Source Line Support) atau dengan memulai debugger dengan opsi baris perintah -lines.
Jika Anda menjalankan perintah l+t , semua langkah program dilakukan satu baris sumber pada satu waktu. Gunakan l-t untuk melangkah satu instruksi perakitan pada satu waktu. Jika Anda menggunakan WinDbg, perintah ini memiliki efek yang sama dengan memilih atau menghapus Mode Sumber pada menu Debug atau menggunakan tombol toolbar.
Perintah l+s menampilkan baris sumber dan nomor baris saat ini pada prompt. Jika Anda hanya ingin melihat nomor baris, gunakan l+l sebagai gantinya.
Jika Anda menggunakan l+o dan l+s, hanya baris sumber yang ditampilkan saat Anda menelusuri program. Penghitung program, kode pembbongkaran, dan informasi register disembunyikan. Tampilan semacam ini memungkinkan Anda untuk dengan cepat menelusuri kode dan tidak melihat apa pun selain sumbernya.
Anda dapat menggunakan perintah lsp (Atur Jumlah Baris Sumber) untuk menentukan dengan tepat berapa banyak baris sumber yang ditampilkan saat Anda menelusuri atau menjalankan aplikasi.
Urutan perintah berikut adalah cara yang efektif untuk menelusuri file sumber.
.lines enable source line information
bp main set initial breakpoint
l+t stepping will be done by source line
l+s source lines will be displayed at prompt
g run program until "main" is entered
pr execute one source line, and toggle register display off
p execute one source line
Karena ENTER mengulangi perintah terakhir, Anda sekarang dapat menelusuri aplikasi dengan menggunakan kunci ENTER. Setiap langkah menyebabkan baris sumber, offset memori, dan kode perakitan muncul.
Untuk informasi selengkapnya tentang cara menginterpretasikan tampilan pembbongkaran, lihat Penelusuran kesalahan dalam Mode Rakitan.
Saat kode rakitan ditampilkan, lokasi memori apa pun yang sedang diakses ditampilkan di ujung kanan baris. Anda dapat menggunakan perintah d* (Memori Tampilan) dan e* (Masukkan Nilai) untuk melihat atau mengubah nilai di lokasi ini.
Jika Anda harus melihat setiap instruksi perakitan untuk menentukan offset atau informasi memori, gunakan l-t untuk langkah demi instruksi perakitan alih-alih baris sumber. Informasi baris sumber masih dapat ditampilkan. Setiap baris sumber sesuai dengan satu atau beberapa instruksi perakitan.
Semua perintah ini tersedia di WinDbg dan di CDB. Anda dapat menggunakan perintah untuk melihat informasi baris sumber dari jendela Perintah Debugger WinDbg alih-alih dari jendela Sumber.
Baris Sumber dan Offset
Anda juga dapat melakukan penelusuran kesalahan sumber dengan menggunakan evaluator ekspresi untuk menentukan offset yang sesuai dengan baris sumber tertentu.
Perintah berikut menampilkan offset memori.
? `[[module!]filename][:linenumber]`
Jika Anda menghilangkan nama file, debugger mencari file sumber yang sesuai dengan penghitung program saat ini.
Debugger membaca linenumber sebagai angka desimal kecuali Anda menambahkan 0x sebelum itu, terlepas dari radix default saat ini. Jika Anda menghilangkan linenumber, ekspresi mengevaluasi ke alamat awal file yang dapat dieksekusi yang sesuai dengan file sumber.
Sintaks ini dipahami dalam CDB hanya jika perintah .lines atau opsi baris perintah -lines telah memuat simbol baris sumber.
Teknik ini sangat serbaguna, karena Anda dapat menggunakannya terlepas dari di mana penghitung program menunjuk. Misalnya, teknik ini memungkinkan Anda mengatur titik henti terlebih dahulu, dengan menggunakan perintah seperti berikut ini.
bp `source.c:31`
Untuk informasi selengkapnya, lihat Sintaks Garis Sumber dan Menggunakan Titik Henti.
Melangkah dan Melacak dalam Mode Sumber
Saat Anda men-debug dalam mode sumber, mungkin ada beberapa panggilan fungsi pada satu baris sumber. Anda tidak dapat menggunakan perintah p dan t untuk memisahkan panggilan fungsi ini.
Misalnya, dalam perintah berikut, perintah t masuk ke GetTickCount dan printf, sementara perintah p melaju di kedua panggilan fungsi.
printf( "%x\n", GetTickCount() );
Jika Anda ingin melangkahi panggilan tertentu saat menelusuri panggilan lain, gunakan .step_filter (Atur Filter Langkah) untuk menunjukkan panggilan mana yang akan dilangkahi.
Anda dapat menggunakan _step_filter untuk memfilter fungsi kerangka kerja (misalnya, panggilan Microsoft Foundation Classes (MFC) atau Pustaka Templat Aktif (ATL).