Проверка контейнеров STL в Xcode

Судя по поиску в Google, Xcode (в моем случае 3.1) должен, по крайней мере, пытаться дать мне нормальное отладочное представление контейнеров STL или, по крайней мере, векторов.

Однако всякий раз, когда я смотрю на вектор в отладчике, я вижу только M_impl с элементами M_start и M_finish (и парой других) — но ничего между ними! (это отладочная сборка, кстати).

Я где-то пропустил настройку или что-то в этом роде?

Я также читал, что есть доступные макросы, которые могут еще больше расширить средство просмотра отладки для проверки более сложных контейнеров, но я не смог их найти.

Я также хотел бы иметь возможность просматривать std::wstrings, не переходя к средству просмотра памяти. Он показывает std::string в порядке. Могу ли я что-нибудь сделать, чтобы показать std::wstring?

Я понимаю, что это немного сложный вопрос, но на самом деле это часть одной и той же темы.


person philsquared    schedule 08.11.2008    source источник


Ответы (3)


Возможность просмотра элементов контейнера может зависеть от сложности шаблонного типа. Для тривиальных объектов, таких как int, bool и т. д., и даже простых шаблонов классов, таких как

template <class T> struct S { T m_t; }

У меня обычно нет проблем с просмотром векторных элементов в представлении переменных отладчика. Я говорю «нормально», потому что время от времени случаются ошибки, из-за которых вещи — особенно при отладке — ведут себя не так, как я ожидал. Одной из таких вещей является мусор или совершенно бесполезная информация в представлении переменных. Обычно чистая перестройка цели (или иногда даже более радикальный перезапуск XCode с последующей чистой перестройкой) устраняет проблему.

Что касается других типов контейнеров, то, скорее всего, эффективно просмотреть эту информацию будет сложно. Например, карта часто реализуется в виде красно-черного дерева. Отладчик должен знать это заранее, чтобы правильно пройтись по дереву и показать вам все ключи и значения. Это, вероятно, требует многого от Xcode или GDB, особенно потому, что первый больше фокусируется на Objective-C и простом C, чем на C++ (отсюда тот факт, что пространства имен имеют тенденцию убивать завершение кода, несмотря на их вездесущность и важность).

person Michel    schedule 09.11.2008
comment
Да, я понимаю, что карты и тому подобное нетривиальны и определенно требуют логики реализации (хотя я мог бы представить систему, в которой она использует общедоступный API для получения информации). Я знаю, что другие IDE справились с этим. Я думал, что должен хотя бы видеть векторы. - person philsquared; 09.11.2008
comment
Поскольку Visual Studio удалось сделать это по крайней мере с 2008 года, я не думаю, что она ожидает слишком многого. - person grim; 15.05.2015

Вы можете создать форматеры данных для различных типов переменных, чтобы они отображались лучше :-).

person Jasper Bekkers    schedule 08.11.2008

Попробуйте использовать отладчик GDB в Project->Edit Scheme... и рассмотрите возможность переключения вашего компилятора на LLVM GCC 4.2 в настройках сборки проекта (в разделе Build Options -> Compiler for C/C++/Objective-C).

В XCode 4 я обнаружил, что мне нужны эти настройки для просмотра таких вещей, как std::vector V3f, где V3f — это шаблонный тип вектора с плавающей запятой.

Обратите внимание, что я думаю, что вы не можете использовать ARC (автоматический подсчет ссылок) с LLVM GCC 4.2.

person Dan Wexler    schedule 11.07.2012