Visual Studio не отображает некоторые просмотренные выражения

В Visual Studio большинство моих объектов и переменных не могут быть разрешены во время сеанса отладки по разным причинам. Это означает, что я не могу проверять или смотреть объекты или их вызывать их функции, что крайне затрудняет отладку моего кода, потому что большинство моих выражений просто не работают. Некоторые типичные ошибки, возникающие при добавлении выражения в окно просмотра, включают:

  • CXX0019: Ошибка: плохой тип
  • CXX0059: Ошибка: левый операнд не является именем функции
  • CXX0058: Ошибка: перегруженный оператор не найден

Чаще всего эти выражения включают перегруженные операторы и/или объекты класса шаблона.

Почему это происходит? как вы его исправите?

Ответ 1

Ошибки, которые у вас есть, связаны с ограничениями в отладчике, там нет ошибок, о которых говорит Даниэль.

Окно часов не может вызывать перегруженные операторы. Если у вас есть, например, a std::vector<int> vecSomething вы не можете поместить vecSomething[0] в окно просмотра, потому что std::vector<int>::operator[] является перегруженным оператором. Следовательно, для вектора объектов вы не можете сделать vecObject[0].SomeMemberVariableOfObject в окне просмотра. Вы можете написать vecObject._Myfirst[0].SomeMemberVariableOfObject. В реализации Visual Studio STL _Myfirst является элементом вектора, указывающего на первый элемент.

Если вы добавите свои собственные переменные и типы в окно просмотра, добавьте часы непосредственно к членам данных. Нет проблем следовать цепочкам указателей типа member.memberStruct.ptrToObj->memberOfObj.

Изменить:

Фактически Visual Studio может вызвать код в окне "Часы": http://geekswithblogs.net/sdorman/archive/2009/02/14/visual-studio-2008-debugging-ndash-the-watch-window.aspx

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

Ответ 2

Проблема и возможные обходные пути точно описаны в этой Документация Microsoft

Оценщик управляемых выражений принимает большинство выражений, написанных на Visual С++. В следующих разделах представлена ​​конкретная информация и обсуждаются некоторые типы выражений, которые не поддерживаются:

Identifiers and Types
Function Evaluation
Operators
Overloaded Operators
Strings
Casts
Object Comparison and Assignment
typeof and sizeof Operators
Boxing
Property Evaluation

Ответ 3

Почему это происходит?

Инструмент имеет свои ограничения. Например, много раз я "перехожу к определению", и определение не найдено. Я должен "найти в файлах". Неудивительно, что некоторые выражения также не оцениваются во время сеансов отладки.

Как вы его исправите?

  • Держите выражения простыми. Не объединить их напрямую, использовать переменные с пояснительными именами для промежуточные результаты.
  • Поддержка вашего кода с явными утверждениями. Если это "неправильно", утверждение должно завершиться неудачей.

Ответ 4

Управление файлами PDB далека от совершенства, конечно, в крупных проектах. В частности, VS имеет довольно глупое поведение слияния всех символов в VSxx.PDB даже в разных проектах. Переключатель /Fd может легко исправить это; пройти $(TargetDir)$(TargetName).pdb или что-то подобное.

Ответ 5

Я нашел одно решение, которое решает (в некоторой степени) проблему перегруженных операторов. Кажется, это не зависит от внутренних элементов класса. Вы должны использовать расширенную форму вызова оператора. Вот пример для vector<int> v:

v.operator[](0)

Я тестировал его на Visual С++ 2012.

Ответ 6

Это может быть связано с вложенными классами Пример:

    class A
    {
        class B
        {
            int i;
        };
    };

литой (B *) (0x12345678) не удастся, но (A:: B *) (0x12345678) преуспеет