Неуправляемый стек вызовов в приложении С#

Я получаю сообщение об ошибке нарушения прав доступа в неуправляемой dll, которую я пишу, но когда я пытаюсь отладить ее в приложении С#, она получит только последний кадр стека вызовов в окне отладки Visual Studio.

У меня есть отладка-> исключения-> System.AccessViolationException, установленная для прерывания отладчика при его запуске.

myunmanaged.dll!ViolatingFunc() Line 100 + 0xc bytes
- - - -
[external code] //myunmanaged.dll!function that I want to see
- - - -
somecsharp.exe!com.somewhere.Form1.CallFuncThatCallsViolator();

Я надеялся пройтись по неуправляемому стеку, чтобы увидеть, где данные превращаются в garbeldegook. Это возможно?

Отвечено введите здесь описание изображения

Включение неуправляемой отладки — это шаг 1, но чтобы дойти до конца, я включил символы Microsoft.

из-за этого моя трассировка стека выглядела примерно так:

myunmanaged.dll!ViolatingFunc() 
- - - -
myunmanaged.dll!SomeFunc2() 
- - - -
myunmanaged.dll!SomeFunc()
- - - -
[managed to unmanaged code transition]
- - - -
somecsharp.exe!com.somewhere.Form1.CallFuncThatCallsViolator();

person Tom Fobear    schedule 18.01.2012    source источник


Ответы (1)


Да, это. Вам необходимо отладить приложение в «Смешанном режиме». Щелкните проект правой кнопкой мыши, выберите вкладку "Отладка" и установите флажок "Включить отладку неуправляемого кода". Вы увидите управляемые и собственные фреймы.

отладка в смешанном режиме

Редактировать: Как упоминает КрисО, отсутствие символов MS может сделать нативную отладку странной. Добавьте следующее в путь символов для символов Windows: http://msdl.microsoft.com/download/symbols

person linuxuser27    schedule 18.01.2012
comment
И лучше всего также загружать символы отладки с сервера символов Microsoft, иногда стеки вызовов выглядят ужасно, пока вы этого не сделаете. - person Chris O; 18.01.2012
comment
@ChrisO Это хороший момент. Я добавлю это к ответу. - person linuxuser27; 18.01.2012
comment
Этот флажок включает отладку неуправляемого кода? который уже установлен для меня, я вижу кадр, в котором возникает проблема, но я не вижу, что произошло между ним и последним управляемым вызовом - person Tom Fobear; 18.01.2012
comment
@TomFobear Вы также можете включить «Исключения первого шанса». Я также хотел бы отметить, что отладка в смешанном режиме может быть сложной. У отладчика много проблем со смешанным режимом, поэтому, если вы все еще видите что-то странное, я бы попытался отладить процесс отдельно как собственный, а затем как управляемый. - person linuxuser27; 18.01.2012
comment
У меня есть одна проверка исключения для брошенного: System.AccessViolationException. это приводит меня к кадру в dll с ошибочным доступом ... но ничего выше этого. Я загрузил символы Microsoft, как предложил ChrisO, но не уверен, что это даст мне то, что я хочу - кадры - это вызовы, сделанные в моей dll. - person Tom Fobear; 18.01.2012