Отладка кода на С++ с использованием: vector, string, STL
Я начинаю С++. Когда я пытаюсь отлаживать код С++, используя следующие конструкции, такие как строка, вектор некоторых родных типов, STL и т.д., Отладка становится утомительной. Я использую MS Visual Studio 2010/Visual С++ 2010 Express.
например.
- При использовании строки, как показано ниже:
string str;
getline(cin, str);
for(i=0; i<str.size();i++)
В окне просмотра не отображаются значения для str [i]. Он говорит, что перегруженный оператор не найден. Мне нужно вручную свернуть всю строчную переменную str и увидеть элемент char в этом конкретном индексе, который становится громоздким.
- При использовании вектора, как показано ниже, та же проблема. Если я установил переменную v1 [k] в окне просмотра той же самой ошибки.
vector<int> v1(100);
for(int k=0;k<100;k++)
{
v1.push_back(k);
}
- Пробовал использовать простые итераторы STL, такие как it.begin(), it.end() и алгоритмы вроде sort(), reverse(), я не мог отлаживать внутри этих функций путем шага или не мог установить точку останова в (я знаю, что они находятся в STL или в какой-то такой стандартной библиотеке, они были бы уверены в отсутствии ошибок, но их можно использовать неправильно, передав что-то недействительное/неправильное)
Исходя из использования языка C на многие годы, на С++, я нахожу это отсутствие "способности отладки" или некоторых ограничений в этом, болезненным, в то время как я пытаюсь понять большие куски кода на С++, написанные кем-то еще, Работа.
Мои вопросы -
Каковы эффективные способы отладки рабочего кода для понимания его функциональности при использовании идиом, таких как шаг, точки останова, точки наблюдения, окна просмотра. Является ли какой-либо конкретный отладчик лучше/хуже других (например, лучше gdb) или есть какие-либо специальные трюки/советы, которые помогут отлаживать.
В общем, как анализировать код на С++, чтобы понять его работу?
Ответы
Ответ 1
Как вы выяснили, попытка использования перегруженных операторов в окне просмотра просто не работает. Вам нужно разбить объекты и вытащить переменные-члены.
В MSVC std::vector
имеет переменную-член _Myfirst
, которая указывает на первый элемент своего буфера. Чтобы получить элемент в индексе i
, вы можете добавить
(v._Myfirst)[i]
В окне просмотра. Вы также можете использовать
(v._Myfirst),10
Чтобы показать первые 10 элементов массива.
Для std::string
должна существовать аналогичная переменная-член.
Ответ 2
У очень небольшого количества типов есть "отладочные визуализаторы", указанные для них, чтобы помочь в отладке. В общем, это фантастическая помощь, и теперь мне почти невозможно что-либо сделать без них (почему меня волнует реализация вектора... Я просто хочу знать, что в нем!)
Если, однако, вы хотите отключить их, google для файла "autoexp.dat", который контролирует это. Вы можете просто удалить несколько строк, и все вернется к плоским типам. Я предупреждаю вас, что такие вещи, как карты и наборы, становятся практически без отладки без визуализаторов.
Альтернативно, переключитесь на С++/CLI. VS2010 не поддерживает отладочные визуализаторы в С++/CLI, что обычно является огромным разочарованием, но я думаю, это может быть то, что вы ищете.
Ответ 3
В Инструменты > Параметры.. > Отладкa > Общие снимите следующие пункты:
- Показывать исходную структуру объектов в переменных windows
- Использовать режим основной совместимости
Затем вы увидите отформатированный вывод.