Debug hanya untuk kode pengguna dengan Just My Code

Just My Code adalah fitur penelusuran kesalahan Visual Studio yang secara otomatis melakukan langkah-langkah panggilan ke sistem, kerangka kerja, dan kode non-pengguna lainnya. Di jendela Tumpukan Panggilan, Just My Code menciutkan panggilan ini ke dalam bingkai [Kode Eksternal].

Just My Code bekerja secara berbeda dalam proyek .NET dan C++.

Mengaktifkan atau menonaktifkan Just My Code

Untuk sebagian besar bahasa pemrograman, Just My Code diaktifkan secara default.

  • Untuk mengaktifkan atau menonaktifkan Just My Code di Visual Studio, di bawahOpsi>Alat (atauOpsi>Opsi) >Penelusuran Kesalahan>Umum, pilih atau batalkan pilihan Aktifkan Hanya Kode Saya.

Cuplikan layar Aktifkan Hanya Kode Saya dalam kotak dialog Opsi.

Cuplikan layar Aktifkan Hanya Kode Saya dalam kotak dialog Opsi.

Catatan

Aktifkan Just My Code adalah pengaturan global yang berlaku untuk semua proyek Visual Studio dalam semua bahasa.

Penelusuran kesalahan Just My Code

Selama sesi penelusuran kesalahan, jendela Modul menunjukkan modul kode mana yang diperlakukan debugger sebagai Just My Code (kode pengguna), bersama dengan status pemuatan simbol mereka. Untuk informasi selengkapnya, lihat Lebih memahami cara debugger dilampirkan ke aplikasi Anda.

Cuplikan layar kode pengguna di jendela Modul.

Cuplikan layar kode pengguna di jendela Modul.

Di jendela Tumpukan Panggilan atau Tugas, Just My Code menciutkan kode non-pengguna ke dalam bingkai kode anotasi berwarna abu-abu berlabel [External Code].

Cuplikan layar Kode Eksternal di jendela Tumpukan Panggilan.

Cuplikan layar Kode Eksternal di jendela Tumpukan Panggilan.

Tip

Untuk membuka Modul, Tumpukan Panggilan, Tugas, atau sebagian besar jendela penelusuran kesalahan lainnya, Anda harus berada dalam sesi penelusuran kesalahan. Saat menelusuri kesalahan dalam Debug>Windows, pilih jendela yang ingin dibuka.

Untuk melihat kode dalam bingkai [External Code] yang diciutkan, klik kanan di jendela Tumpukan Panggilan atau Tugas, dan pilih Tampilkan Kode Eksternal dari menu konteks. Baris kode eksternal yang diperluas menggantikan bingkai [External Code].

Cuplikan layar Tampilkan Kode Eksternal di jendela Tumpukan Panggilan.

Cuplikan layar Tampilkan Kode Eksternal di jendela Tumpukan Panggilan.

Catatan

Tampilkan Kode Eksternal adalah pengaturan pembuat profil pengguna saat ini yang berlaku untuk semua proyek dalam semua bahasa yang dibuka oleh pengguna.

Mengeklik dua kali baris kode eksternal yang diperluas di jendela Tumpukan Panggilan menyoroti baris kode panggilan berwarna hijau dalam kode sumber. Untuk DLL atau modul lain yang tidak ditemukan atau dimuat, simbol atau sumber yang tidak ditemukan halaman dapat terbuka.

Mulai dari Visual Studio 2022 versi 17.7, Anda dapat mendekompilasi otomatis kode .NET dengan mengklik dua kali kode eksternal di jendela Tumpukan Panggilan. Untuk informasi selengkapnya, lihat Membuat kode sumber dari rakitan .NET saat penelusuran kesalahan.

Just My Code .NET

Dalam proyek .NET, Just My Code menggunakan file simbol (.pdb) dan pengoptimalan program untuk mengklasifikasikan kode pengguna dan non-pengguna. Debugger .NET menganggap biner yang dioptimalkan dan file .pdb yang tidak dimuat menjadi kode non-pengguna.

Tiga atribut kompilator juga memengaruhi apa yang dianggap oleh debugger .NET sebagai kode pengguna:

Debugger .NET menganggap semua kode lain sebagai kode pengguna.

Selama penelusuran kesalahan .NET:

  • Debug>Masuk (atau F11) pada langkah-langkah kode non-pengguna di atas kode ke baris kode pengguna berikutnya.
  • Debug>Keluar (atau Shift+F11) pada kode non-pengguna yang berjalan ke baris kode pengguna berikutnya.

Jika tidak ada kode pengguna lagi, penelusuran kesalahan berlanjut hingga berakhir, mencapai titik henti lain, atau melempar kesalahan.

Jika debugger terputus di kode non-pengguna (misalnya, Anda menggunakan Debug>Hentikan Semua dan jeda dalam kode non-pengguna), jendela Tidak Ada Sumber muncul. Anda kemudian dapat menggunakan perintah Langkah>Debug untuk melanjutkan ke baris kode pengguna berikutnya.

Jika pengecualian yang tidak tertangani terjadi dalam kode non-pengguna, debugger akan berhenti di baris kode pengguna tempat pengecualian dibuat.

Jika pengecualian kesempatan pertama diaktifkan untuk pengecualian, baris kode pengguna panggilan disoroti dengan warna hijau dalam kode sumber. Jendela Tumpukan Panggilan menampilkan bingkai anotasi berlabel [External Code].

Just My Code C++

Mulai di Visual Studio 2017 versi 15.8, Just My Code untuk langkah kode juga didukung. Fitur ini juga memerlukan penggunaan pengalihan kompilator /JMC (Hanya penelusuran kesalahan kode saya). Pengalihan diaktifkan secara default dalam proyek C++. Untuk jendela Call Stack dan dukungan tumpukan panggilan di Just My Code, sakelar /JMC tidak diperlukan.

Untuk diklasifikasikan sebagai kode pengguna, PDB untuk biner yang berisi kode pengguna harus dimuat oleh debugger (gunakan jendela Modul untuk memeriksa ini).

Untuk perilaku tumpukan panggilan, seperti di jendela Tumpukan Panggilan, Just My Code di C++ hanya menganggap fungsi-fungsi ini sebagai kode non-pengguna:

  • Fungsi dengan informasi sumber yang dikupas dalam file simbolnya.
  • Fungsi di mana file simbol menunjukkan bahwa tidak ada file sumber yang sesuai dengan bingkai tumpukan.
  • Fungsi yang ditentukan dalam file *.natjmc di folder %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.

Untuk perilaku langkah kode, Just My Code di C++ hanya menganggap fungsi-fungsi ini sebagai kode non-pengguna:

  • Fungsi yang file PDB terkait belum dimuat dalam debugger.
  • Fungsi yang ditentukan dalam file *.natjmc di folder %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.

Catatan

Untuk dukungan langkah kode di Just My Code, kode C++ harus dikompilasi menggunakan kompilator MSVC di Visual Studio 15.8 Pratinjau 3 atau yang lebih baru, dan pengalihan kompilator /JMC harus diaktifkan (diaktifkan secara default). Untuk detail tambahan, lihat Sesuaikan tumpukan panggilan C++ dan perilaku langkah kode dan posting blog ini. Untuk kode yang dikompilasi menggunakan kompilator yang lebih lama, file .natstepfilter adalah satu-satunya cara untuk menyesuaikan langkah kode, yang independen dari Just My Code. Lihat Menyesuaikan perilaku langkah C++.

Selama penelusuran kesalahan C++, kode non-pengguna dilewati secara default. Selama penelusuran kesalahan C++:

  • Debug>Step Into (atau F11) pada langkah-langkah kode non-pengguna melalui kode atau berjalan ke baris kode pengguna berikutnya, jika Step Into dipanggil dari kode non-pengguna.
  • Debug>Step Out (atau Shift+F11) pada kode non-pengguna berjalan ke baris kode pengguna berikutnya (di luar bingkai tumpukan saat ini).

Jika tidak ada kode pengguna lagi, penelusuran kesalahan berlanjut hingga berakhir, mencapai titik henti lain, atau melempar kesalahan.

Jika debugger berhenti dalam kode non-pengguna (misalnya, Anda menggunakan Debug>Hentikan Semua dan jeda dalam kode non-pengguna), langkah berlanjut dalam kode non-pengguna.

Jika debugger mencapai pengecualian, debugger akan berhenti pada pengecualian, baik dalam kode pengguna atau non-pengguna. Opsi yang tidak tertangani pengguna dalam kotak dialog Pengaturan Pengecualian diabaikan.

Menyesuaikan tumpukan panggilan C++ dan perilaku langkah kode

Untuk proyek C++, Anda dapat menentukan modul, file sumber, dan fungsi jendela Tumpukan Panggilan memperlakukannya sebagai kode non-pengguna dengan menentukannya dalam file *.natjmc. Penyesuaian ini juga berlaku untuk langkah kode jika Anda menggunakan pengkompilasi terbaru (lihat C++ Just My Code).

  • Untuk menentukan kode non-pengguna untuk semua pengguna komputer Visual Studio, tambahkan file .natjmc ke folder %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.
  • Untuk menentukan kode non-pengguna untuk pengguna individual, tambahkan file .natjmc ke folder %USERPROFILE%\My Documents\<Visual Studio version>\Visualizers.

File .natjmc adalah file XML dengan sintaks ini:

<?xml version="1.0" encoding="utf-8"?>
<NonUserCode xmlns="http://schemas.microsoft.com/vstudio/debugger/jmc/2015">

  <!-- Modules -->
  <Module Name="ModuleSpec" />
  <Module Name="ModuleSpec" Company="CompanyName" />

  <!-- Files -->
  <File Name="FileSpec"/>

  <!-- Functions -->
  <Function Name="FunctionSpec" />
  <Function Name="FunctionSpec" Module ="ModuleSpec" />
  <Function Name="FunctionSpec" Module ="ModuleSpec" ExceptionImplementation="true" />

</NonUserCode>

Atribut elemen modul

Atribut Deskripsi
Name Harus diisi. Jalur lengkap modul atau modul. Anda dapat menggunakan karakter wildcard Windows ? (nol atau satu karakter) dan * (nol karakter atau lebih). Contohnya,

<Module Name="?:\3rdParty\UtilLibs\*" />

memberi tahu debugger untuk memperlakukan semua modul di \3rdParty\UtilLibs pada drive apa pun sebagai kode eksternal.
Company Opsional. Nama perusahaan yang menerbitkan modul yang disematkan dalam file yang dapat dijalankan. Anda dapat menggunakan atribut ini untuk membedakan modul.

Atribut elemen file

Atribut Deskripsi
Name Harus diisi. Jalur lengkap file sumber atau file untuk diperlakukan sebagai kode eksternal. Anda dapat menggunakan karakter wildcard Windows ? dan * saat menentukan jalur.

Atribut elemen fungsi

Atribut Deskripsi
Name Harus diisi. Nama fungsi yang sepenuhnya memenuhi syarat untuk diperlakukan sebagai kode eksternal. Anda dapat menggunakan karakter ? kartubebas Windows dan * saat menentukan jalur.
Module Opsional. Nama atau jalur lengkap ke modul yang berisi fungsi. Anda dapat menggunakan atribut ini untuk membedakan fungsi dengan nama yang sama.
ExceptionImplementation Ketika diatur ke true, tumpukan panggilan menampilkan fungsi yang membuat pengecualian dibanding fungsi ini.

Menyesuaikan perilaku langkah C++ yang independen dari pengaturan Just My Code

Dalam proyek C++, Anda dapat menentukan fungsi yang akan dilangkahi dengan mencantumkannya sebagai fungsi NoStepInto dalam file *.natstepfilter . Fungsi yang tercantum dalam file *.natstepfilter tidak bergantung pada pengaturan Just My Code. Fungsi NoStepInto memberi tahu debugger untuk melangkahi fungsi, bahkan jika memanggil beberapa fungsi StepInto atau kode pengguna lainnya. Tidak seperti fungsi yang tercantum dalam .natjmc, debugger akan melangkah ke baris pertama kode pengguna di dalam fungsi NoStepInto.

  • Untuk menentukan kode non-pengguna untuk semua pengguna Visual Studio lokal, tambahkan file .natstepfilter ke folder %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.
  • Untuk menentukan kode non-pengguna untuk pengguna individual, tambahkan file .natstepfilter ke folder %USERPROFILE%\My Documents\<Visual Studio version>\Visualizers.

Catatan

Beberapa ekstensi pihak ketiga dapat menonaktifkan fungsionalitas .natstepfilter .

File .natstepfilter adalah file XML dengan sintaks ini:

<?xml version="1.0" encoding="utf-8"?>
<StepFilter xmlns="http://schemas.microsoft.com/vstudio/debugger/natstepfilter/2010">
    <Function>
        <Name>FunctionSpec</Name>
        <Action>StepAction</Action>
    </Function>
    <Function>
        <Name>FunctionSpec</Name>
        <Module>ModuleSpec</Module>
        <Action>StepAction</Action>
    </Function>
</StepFilter>

Elemen Deskripsi
Function Harus diisi. Menentukan satu atau beberapa fungsi sebagai fungsi non-pengguna.
Name Harus diisi. Ekspresi reguler berformat ECMA-262 yang menentukan nama fungsi lengkap yang cocok. Contohnya:

<Name>MyNS::MyClass::.*</Name>

memberi tahu debugger bahwa semua metode di MyNS::MyClass harus dianggap sebagai kode non-pengguna. Pencocokan ini peka huruf besar/kecil.
Module Opsional. Ekspresi reguler berformat ECMA-262 yang menentukan jalur lengkap ke modul yang berisi fungsi. Pencocokan tidak peka huruf besar/kecil.
Action Harus diisi. Salah satu nilai peka huruf besar/kecil ini:

NoStepInto - memberi tahu debugger untuk melewati fungsi.
StepInto - memberi tahu debugger untuk melewati ke fungsi, mengambil alih fungsi NoStepInto lain untuk fungsi yang cocok.

Informasi tambahan tentang file .natstepfilter dan .natjmc

  • Mulai visual Studio 2022 versi 17.6, Anda dapat menambahkan file .natjmc dan .natstepfilter langsung ke solusi atau proyek.

  • Kesalahan sintaks dalam file .natstepfilter dan .natjmc tidak dilaporkan di jendela Output debugger.

  • Tidak seperti file .natvis , file .natstepfilter dan .natjmc tidak dimuat ulang. Sebagai gantinya, file-file ini dimuat ulang di dekat awal sesi debug.

  • Untuk fungsi templat, penggunaan &lt;.*&gt; atau &lt;.* dalam nama mungkin berguna.

Just My Code JavaScript

JavaScript Just My Code mengontrol tampilan langkah dan tumpukan panggilan dengan mengategorikan kode dalam salah satu klasifikasi ini:

Klasifikasi Deskripsi
MyCode Kode pengguna yang Anda miliki dan kontrol.
LibraryCode Kode non-pengguna dari pustaka yang Anda gunakan secara teratur dan aplikasi Anda bergantung untuk berfungsi dengan benar (misalnya, jQuery).
UnrelatedCode Kode non-pengguna di aplikasi yang tidak Anda miliki dan tidak diandalkan oleh aplikasi agar berfungsi dengan benar. Misalnya, SDK iklan yang menampilkan iklan bisa berupa UnrelatedCode.

Debugger JavaScript mengklasifikasikan kode sebagai pengguna atau non-pengguna dalam urutan ini:

  1. Klasifikasi default.

    • Skrip yang dijalankan dengan meneruskan string ke fungsi yang disediakan eval host adalah MyCode.
    • Skrip yang dijalankan dengan meneruskan string ke konstruktor Function adalah LibraryCode.
    • Skrip dalam referensi kerangka kerja, seperti WinJS atau Azure SDK, adalah LibraryCode.
    • Skrip yang dijalankan dengan meneruskan string ke fungsi setTimeout, setImmediate, atau setIntervaladalah UnrelatedCode.
  2. Klasifikasi dalam file mycode.json dari proyek saat ini.

Setiap langkah klasifikasi mengambil alih langkah-langkah sebelumnya.

Semua kode lain diklasifikasikan sebagai MyCode.

Anda dapat memodifikasi klasifikasi default, dan mengklasifikasikan file dan URL tertentu sebagai kode pengguna atau non-pengguna, dengan menambahkan file .json bernama mycode.json ke folder akar proyek JavaScript. Lihat Menyesuaikan JavaScript Just My Code.

Selama penelusuran kesalahan JavaScript:

  • Jika fungsi adalah kode non-pengguna, Debug>Masuk (atau F11) berperilaku sama dengan Debug>Lewati (atau F10).
  • Jika langkah dimulai dalam kode non-pengguna (LibraryCode atau UnrelatedCode), melangkah untuk sementara bersifat seolah-olah Just My Code tidak diaktifkan. Saat Anda kembali ke kode pengguna, langkah Just My Code diaktifkan kembali.
  • Ketika langkah kode pengguna hasilnya meninggalkan konteks eksekusi saat ini, debugger berhenti di baris kode pengguna yang dijalankan berikutnya. Misalnya, jika panggilan balik dijalankan dalam kode LibraryCode, debugger berlanjut hingga baris kode pengguna berikutnya dijalankan.
  • Keluar (atau Shift+F11) berhenti pada baris kode pengguna berikutnya.

Jika tidak ada kode pengguna lagi, penelusuran kesalahan berlanjut hingga berakhir, mencapai titik henti lain, atau melempar kesalahan.

Titik henti yang diatur dalam kode selalu berhasil, tetapi kode diklasifikasikan.

  • Jika kata kunci debugger terjadi di dalam LibraryCode, debugger selalu rusak.
  • Jika kata kunci debugger terjadi di UnrelatedCode, debugger tidak berhenti.

Jika pengecualian yang tidak tertangani terjadi dalam kode MyCode atau LibraryCode, debugger selalu rusak.

Jika pengecualian yang tidak tertangani terjadi di UnrelatedCode, dan MyCode atau LibraryCode berada di tumpukan panggilan, debugger akan berhenti.

Jika pengecualian kesempatan pertama diaktifkan untuk pengecualian, dan pengecualian terjadi di LibraryCode atau UnrelatedCode:

  • Jika pengecualian ditangani, debugger tidak rusak.
  • Jika pengecualian tidak ditangani, debugger akan berhenti.

Kustomisasi JavaScript Just My Code

Untuk mengategorikan kode pengguna dan non-pengguna untuk satu proyek JavaScript, Anda dapat menambahkan file .json bernama mycode.json ke folder akar proyek.

File mycode.json tidak perlu mencantumkan semua pasangan nilai kunci. Nilai MyCode, Libraries, dan Unrelated bisa berupa array kosong.

File Mycode.json menggunakan sintaks ini:

{
    "Eval" : "Classification",
    "Function" : "Classification",
    "ScriptBlock" : "Classification",
    "MyCode" : [
        "UrlOrFileSpec",
        . . .
        "UrlOrFileSpec"
    ],
    "Libraries" : [
        "UrlOrFileSpec",
        . .
        "UrlOrFileSpec"
    ],
    "Unrelated" : [
        "UrlOrFileSpec",
        . . .
        "UrlOrFileSpec"
    ]
}

Evaluasi, Fungsi, dan ScriptBlock

Pasangan nilai kunci Evaluasi, Fungsi, dan ScriptBlock menentukan seberapa dinamis kode yang dihasilkan akan diklasifikasikan:

Nama Deskripsi
Evaluasi Skrip yang dijalankan dengan meneruskan string ke fungsi eval yang disediakan host. Secara default, skrip Eval diklasifikasikan sebagai MyCode.
Fungsi Skrip yang dijalankan dengan meneruskan string ke konstruktor Function. Secara default, skrip Fungsi diklasifikasikan sebagai LibraryCode.
ScriptBlock Skrip yang dijalankan dengan meneruskan string ke fungsi setTimeout, setImmediate, atau setInterval. Secara default, skrip ScriptBlock diklasifikasikan sebagai UnrelatedCode.

Anda dapat mengubah nilai ke salah satu kata kunci ini:

  • MyCode mengklasifikasikan skrip sebagai MyCode.
  • Library mengklasifikasikan skrip sebagai LibraryCode.
  • Unrelated mengklasifikasikan skrip sebagai UnrelatedCode.

MyCode, Libraries, dan Unrelated

Pasangan nilai kunci MyCode, Libraries, dan Unrelated menentukan URL atau file yang ingin Anda sertakan dalam klasifikasi:

Nama Deskripsi
MyCode Array URL atau file yang diklasifikasikan sebagai MyCode.
Perpustakaan Array URL atau file yang diklasifikasikan sebagai LibraryCode.
Tidak Terkait Array URL atau file yang diklasifikasikan sebagai UnrelatedCode.

URL atau string file dapat memiliki satu atau beberapa karakter *, yang cocok dengan nol karakter atau lebih. * sama dengan ekspresi reguler .*.