PInvokeStackImbalance MDA

Catatan

Artikel ini khusus untuk .NET Framework. Ini tidak berlaku untuk implementasi .NET yang lebih baru, termasuk .NET 6 dan versi yang lebih baru.

Asisten penelusuran kesalahan terkelola (MDA) PInvokeStackImbalance diaktifkan ketika CLR mendeteksi bahwa kedalaman tumpukan setelah panggilan pemanggilan platform tidak cocok dengan kedalaman tumpukan yang diharapkan, mengingat konvensi panggilan yang ditentukan dalam atribut DllImportAttribute dan deklarasi parameter dalam tanda tangan terkelola.

PInvokeStackImbalance MDA hanya diimplementasikan untuk platform x86 32-bit.

Catatan

PInvokeStackImbalance MDA dinonaktifkan secara default. Di Visual Studio 2017 dan versi yang lebih baru, PInvokeStackImbalance MDA muncul di daftar Asisten Penelusuran Kesalahan Terkelola dalam kotak dialog Pengecualian Pengaturan (yang ditampilkan saat Anda memilih Debug>Windows>Pengaturan Pengecualian). Namun, memilih atau menghapus kotak centang Jeda Saat Dilemparkan tidak mengaktifkan atau menonaktifkan MDA; ini hanya mengontrol apakah Visual Studio melempar pengecualian ketika MDA diaktifkan.

Gejala

Aplikasi mengalami pelanggaran akses atau kerusakan memori saat melakukan atau mengikuti panggilan pemanggilan platform.

Penyebab

Tanda tangan terkelola dari panggilan pemanggilan platform mungkin tidak cocok dengan tanda tangan metode tak terkelola yang dipanggil. Ketidakcocokan ini dapat disebabkan oleh tanda tangan terkelola yang tidak mendeklarasikan jumlah parameter yang benar atau tidak menentukan ukuran yang sesuai untuk parameter. MDA juga dapat diaktifkan karena konvensi panggilan, mungkin ditentukan oleh atribut DllImportAttribute, tidak cocok dengan konvensi panggilan yang tidak dikelola.

Resolusi

Tinjau konvensi pemanggilan tanda tangan dan panggilan platform terkelola untuk mengonfirmasi bahwa platform tersebut cocok dengan konvensi tanda tangan dan panggilan target asli. Coba tentukan konvensi panggilan secara eksplisit di sisi terkelola dan tidak terkelola. Dimungkinkan juga, meskipun tidak mungkin, bahwa fungsi yang tidak dikelola tidak menyeimbangkan tumpukan karena alasan lain, seperti bug di kompiler yang tidak dikelola.

Efek pada Runtime

Memaksa semua platform menggunakan panggilan untuk mengambil jalur yang tidak optimal di CLR.

Output

Pesan MDA memberikan nama panggilan metode pemanggilan platform yang menyebabkan ketidakseimbangan tumpukan. Contoh pesan dari panggilan memanggil platform pada metode SampleMethod adalah:

Panggilan ke fungsi PInvoke 'SampleMethod' memiliki tumpukan yang tidak seimbang. Ini mungkin karena tanda tangan PIN yang dikelola tidak cocok dengan tanda tangan target yang tidak dikelola. Periksa apakah konvensi pemanggilan dan parameter tanda tangan PINvoke cocok dengan tanda tangan target yang tidak dikelola.

Konfigurasi

<mdaConfig>
  <assistants>
    <pInvokeStackImbalance />
  </assistants>
</mdaConfig>

Lihat juga