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


pInvokeStackImbalance MDA

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

ПримечаниеПримечание

MDA pInvokeStackImbalance реализуется только для 32-разрядных (х86) платформ.

ПримечаниеПримечание

MDA pInvokeStackImbalance в .NET Framework версии 3.5 по умолчанию отключен.При использовании .NET Framework версии 3.5 с Visual Studio 2005, MDA pInvokeStackImbalance отобразится в списке Управляемые помощники по отладке диалогового окна Исключения (которое отображается при выборе Исключения в меню Отладка).Тем не менее, флажок Вызов для pInvokeStackImbalance служит не для включения или отключения MDА; он только контролирует вызов исключения в Visual Studio, когда активируется MDA.

Признаки

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

Причина

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

Решение

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

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

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

Output

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

A call to PInvoke function 'SampleMethod' has unbalanced the stack. 
This is likely because the managed PInvoke signature does not match 
the unmanaged target signature. Check that the calling convention and 
parameters of the PInvoke signature match the target unmanaged signature.

Конфигурация

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

См. также

Ссылки

MarshalAsAttribute

Основные понятия

Диагностика ошибок посредством управляемых помощников по отладке

Маршалинг взаимодействия

Другие ресурсы

Взаимодействие