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>
См. также
Ссылки
Основные понятия
Диагностика ошибок посредством управляемых помощников по отладке