Проблемы отслеживания отладчика Visual Studio

Как я могу узнать адрес переменной в стеке в окне просмотра отладчика Visual Studio (или где-то еще?)

Чтение переменной работает нормально:

streets     streets [11790](0x1c66a690 [...] std::vector<Street *,std::allocator<Street *> >

Но префикс & не дает мне адреса:

&streets        streets [11790](0x1c66a690 [...] std::vector<Street *,std::allocator<Street *> >

Кроме того, попытка прочитать размер не работает, почему это так?

streets.size()  CXX0075: Error: Cannot set up Function Evaluation   

Программа компилируется в режиме отладки.


person Sideshow Bob    schedule 16.11.2012    source источник
comment
&streets должен дать вам указатель на вашу переменную, я сомневаюсь, что окно просмотра может выполнять такие функции, как vector::size().   -  person marcinj    schedule 16.11.2012
comment
@marcin_j: На самом деле может. Окно просмотра VS довольно мощное.   -  person John Dibling    schedule 16.11.2012
comment
@JohnDibling хорошо, мне нужно проверить это с моим VS2005   -  person marcinj    schedule 16.11.2012


Ответы (2)


Отладчик Visual Studio управляет просмотрами отладчика, быстрым просмотром, автоматическими представлениями и представлениями локальных переменных с помощью преобразования, определенного схемой в файле с именем autoexp.dat (в зависимости от вашей версии VS его содержимое может различаться). заметно). Файл находится в папке VS-InstallDir/Common7/Packages/Debugger (по крайней мере, для VS2010 и VS2012).

Зная это, пара идей для вас, чтобы попробовать/рассмотреть:

Первый метод: ноу-хау библиотеки

Чтобы получить доступ к фактическому адресу первого элемента внутри вектора, я в конечном счете просто делаю это:

streets._Myfirst

если вы знаете количество элементов, которые собираетесь просматривать, вы можете использовать расширение расширения массива:

streets._Myfirst,N

где N количество элементов

Примечание: это работает только с векторами, как показано выше. Практика отличается в зависимости от того, какой контейнер вы используете. Несомненно, есть более простые способы, которые, вероятно, менее зависят от реализации std::vector‹>, но это самый простой способ, который я знаю, как быстро поднять вас и начать отладку.


Метод второй: выжженная земля

В разделе «Инструменты/Параметры/Отладка/Общие» находится список функций, которые вы можете включать и выключать. Один из них вы найдете особенно полезным для этого вопроса:

Показать необработанную структуру объектов в переменных окнах.

Включите этот параметр ON, чтобы увидеть необработанные переменные-члены всех структур и контейнеров, включая стандартные контейнеры, такие как std::vector‹>. Это эффективно отключает использование шаблонов в autoexp.dat.

person WhozCraig    schedule 16.11.2012
comment
Первый способ работает хорошо, спасибо. Конечно, размер вектора можно получить, введя streets._Mylast - streets._Myfirst. Не уверен, почему vector::size() не работает, но тьфу кому это нужно. - person Sideshow Bob; 20.11.2012

Чтобы увидеть адрес, приведите к void *, например: (void *)&streets.

Это попытка Visual Studio быть полезной, напрямую показывая вам указанный вектор. Аналогичная проблема касается массивов векторов.

person Tom Seddon    schedule 16.11.2012