Поделиться через


PInvokeStackImbalance MDA

Примечание.

Эта статья относится к .NET Framework. Он не применяется к более новым реализациям .NET, включая .NET 6 и более поздние версии.

Помощник PInvokeStackImbalance по управляемой отладке (MDA) активируется, когда среда CLR обнаруживает, что глубина стека после вызова платформы не соответствует ожидаемой глубине стека, учитывая соглашение о вызовах, указанное в DllImportAttribute атрибуте, и объявление параметров в управляемой сигнатуре.

MDA PInvokeStackImbalance реализован только для 32-разрядных платформ x86.

Примечание.

По PInvokeStackImbalance умолчанию MDA отключен. В Visual Studio 2017 и более поздних версиях PInvokeStackImbalance MDA отображается в списке "Помощники по управляемой отладке" в диалоговом окне "Параметры исключений" (которое отображается при выборе параметров исключения Для отладки>Windows).> Однако при нажатии или очистке флажка "Разрыв при возникновении" не включает или отключает MDA. Он определяет, вызывает ли Visual Studio исключение при активации MDA.

Симптомы

В приложении обнаружено нарушение прав доступа или повреждение памяти при выполнении или отслеживании вызова неуправляемого кода.

Причина

Управляемая сигнатура вызова неуправляемого кода может не соответствовать неуправляемой сигнатуре вызываемого метода. Это несоответствие может быть вызвано тем, что управляемая сигнатура не объявляет правильное количество параметров или не задает соответствующий размер для этих параметров. MDA также может активироваться, поскольку соглашение о вызовах, возможно указанное атрибутом DllImportAttribute, не соответствует соглашению о вызовах неуправляемого кода.

Разрешение

Просмотрите сигнатуру вызова неуправляемого кода и соглашение о вызовах, чтобы убедиться, что они соответствуют сигнатуре и соглашению о вызовах исходного целевого объекта. Попробуйте явным образом задать соглашение о вызовах для управляемой и неуправляемой сторон. Также возможно, хотя и маловероятно, что неуправляемая функция внесла дисбаланс в стек по какой-либо другой причине, например из-за ошибки в неуправляемом компиляторе.

Влияние на среду выполнения

Заставляет все вызовы неуправляемого кода принимать неоптимизированный путь в среде CLR.

Выходные данные

Сообщение MDA предоставляет имя вызова метода вызова неуправляемого кода, который привел к несбалансированности стека вызова. Пример сообщения вызова неуправляемого кода в методе SampleMethod:

Вызов функции PInvoke "SampleMethod" разбалансировал стек. Скорее всего, это связано с тем, что управляемая подпись PInvoke не соответствует неуправляемой целевой подписи. Убедитесь, что соглашение о вызовах и параметры подписи PInvoke соответствуют целевой неуправляемой подписи.

Настройка

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

См. также