Не отображается содержимое переменной при отладке кода C ++, вызываемого из управляемого приложения

У меня есть собственные библиотеки DLL C, которые я вызываю из библиотеки Managed C ++ Class (Rem). В библиотеке классов Rem у меня есть один собственный класс C ++ (api) и один управляемый класс C ++ (API).

Управляемый класс (API) на данный момент вызывается из консольного приложения C # (позже будет использоваться в веб-приложении).

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

Моя проблема в том, что при отладке я не вижу значений каких-либо переменных, кроме простых типов, объявленных локально.

Параметры функции недоступны в отладчике, и если я попытаюсь добавить их как Watch, он просто скажет ошибку: идентификатор 'schema_name' вне области видимости ('schema_name' - это имя переменной)

Любые структуры просто показывают значение {...} как в быстром просмотре, так и в окне просмотра. введите описание изображения здесь

Если я попытаюсь добавить часы к полю в структуре, я получу ошибку значения: 'entryList.numItems' не существует

Что я пробовал:

  • Я пробовал создать консольное приложение на управляемом C ++ и отлаживать его, то же самое.

  • Я попытался снять флажок Инструменты- ›Параметры-› Отладка- ›Общие-› Управляемый режим совместимости C ++, после чего я вообще не смог войти в код (символы для точек останова не загружены)

  • В проекте консольного приложения C # я вошел в Свойства- ›Отладка и установил флажок« Включить отладку собственного кода »(и снял флажок с него).

  • В библиотеке классов C ++ я перешел в Свойства- ›Отладка-› Тип отладчика и попробовал смешанный, собственный, управляемый и автоматический.

Есть предложения относительно того, что я делаю не так?


person henriksen    schedule 23.04.2013    source источник
comment
+1 за краткий и хорошо сформулированный вопрос.   -  person Moo-Juice    schedule 23.04.2013
comment
потенциальный дубликат этого   -  person ldgorman    schedule 23.04.2013
comment
Вы работаете в режиме выпуска или отладки? В режиме выпуска вам все еще разрешено пошагово выполнять код, но без символов отладки вы фактически ничего не видите.   -  person IdeaHat    schedule 23.04.2013
comment
@ldgorman, вопрос, на который вы ссылаетесь как на потенциальный дубликат, касается только C #, а не комбинации управляемого и неуправляемого - хотя, конечно, это может быть одна и та же проблема :)   -  person Moo-Juice    schedule 23.04.2013
comment
@MadScienceDreams, я работаю в режиме отладки и все оптимизации отключены. Я вижу значения локально объявленных переменных. Например: int count = result- ›numOfItems После этой строки я могу видеть значение count и наблюдать за ним, но результат - это просто {...}, а numOfItems недоступен.   -  person henriksen    schedule 23.04.2013
comment
@Idgorman, хорошее предложение, но я уже нахожусь в режиме отладки и отключил оптимизацию.   -  person henriksen    schedule 23.04.2013
comment
Я не могу предложить никаких решений, только скажу, как я могу это исследовать, о чем вы, возможно, уже думали. Если вы создадите упрощенную версию своей C dll, у вас возникнет такая же проблема, например создать новый проект с нуля и извлечь один файл из вашей библиотеки DLL C и вырезать большую часть реализации из этого файла? (Я предполагаю, что если вы создаете консольное приложение C ++, выполняющее эквивалент вашего консольного приложения C #, тогда отладка работает нормально.)   -  person TooTone    schedule 24.04.2013
comment
@TooTone Я создал управляемое консольное приложение C ++, выполняющее то же самое, что и приложение C #, и у меня такая же проблема. У меня есть еще один проект с чистым консольным приложением C, использующим ту же собственную библиотеку, и там отладка работает нормально. Похоже, что при отладке машинного кода при переходе из управляемого приложения возникает проблема.   -  person henriksen    schedule 24.04.2013
comment
@henriksen Я не думаю, что ваша проблема связана с отладкой родного из управляемого. Я проверил решение, которое я написал в прошлом году в vs2008, с вызовом C # управляемого C ++ с вызовом собственного C ++, и я мог расширить базовые структуры stl в моей собственной библиотеке.   -  person TooTone    schedule 24.04.2013
comment
@henriksen Я также попробовал тестовый пример для вашей проблемы. В vs2010 я создал управляемое консольное приложение C ++, а затем собственную dll (Win32Project / DLL). Я добавил простую структуру в файл cpp, создал глобальную переменную этой структуры, а затем отредактировал пример экспортируемой функции, чтобы изменить глобальную переменную и printf вывести ее codepad.org/A3Pc8o56. Мне удалось выполнить отладку в собственной библиотеке DLL и увидеть элементы структуры. Затем я попытался изменить различные параметры компиляции и связывания в dll. Ничего из этого не испортило мою отладку. Вы можете заставить это работать? Если да, может быть, отредактируйте свой код C ...?   -  person TooTone    schedule 24.04.2013
comment
Я очень ценю все ваши усилия, ребята, пытаясь мне помочь! Это то, что делает SO таким прекрасным местом! Жаль, что это ошибка в VS: P Спасибо!   -  person henriksen    schedule 30.04.2013
comment
У меня такая же проблема с Visual Studio 2012 Update 4. В качестве временного решения я просто копирую параметры функции (например, указатели на структуру) в локальные переменные того же типа. Эти локальные переменные отображаются правильно. Конечно, я делаю это, только если установлен DEBUG.   -  person MTR    schedule 11.06.2015


Ответы (1)


Я предполагаю, что вы используете Visual Studio 2012 с обновлением 2. В этом случае - это известная ошибка с обновлением 2:

https://connect.microsoft.com/VisualStudio/feedback/details/783004/children-cannot-be-evaluated-on-c-cli-after-vs2012-update-2

Однако будьте осторожны, "обходной путь" удаления обновления 2 оставит вас с неработающей Visual Studio, как показано в этом отчете об ошибке (да, обновление 2 не работает):

https://connect.microsoft.com/VisualStudio/feedback/details/785396/uninstalling-vs2012-update-2-and-repair-of-vs-results-in-atl-files-missing

Если вы не используете Обновление 2, это может быть неправильный ответ, но он может помочь другим, кто сталкивается именно с этой проблемой при использовании Обновления 2.

person Excelcius    schedule 25.04.2013
comment
Похоже, вот оно. У меня установлено обновление 2. Мне просто нужно подождать до следующей CTP обновления 3. Спасибо! - person henriksen; 30.04.2013