Можно ли узнать, какие строки исходного кода были выполнены? - PullRequest
3 голосов
/ 21 сентября 2010

Я отлаживаю код C / C ++ с помощью Visual Studio. Есть цикл, называемый 10000 раз, и в одном из взаимодействий в конце цикла возникает ошибка, поскольку программа пытается получить доступ к значению N + 1 массива длины N. Я хочу вернуться назад и отлаживать источник ошибки, и мне интересно, может ли Visual Studio в режиме отладки каким-либо образом визуально выделить или сказать, какие строки исходного кода были выполнены. Тогда было бы легче найти ошибку. Кто-нибудь знает, возможно ли это?

Если это невозможно с VS, какие другие подходы могут сделать это?

Спасибо

РЕДАКТИРОВАТЬ: Мне также интересно, если это можно сделать с любой другой IDE (Eclipse, Xcode, командной строки и т. Д.)

Ответы [ 9 ]

8 голосов
/ 21 сентября 2010

ставит условную точку останова, где происходит доступ к массиву. Таким образом, ваша программа прервется при N + 1-м доступе, и у вас будет полная трассировка стека для работы.

6 голосов
/ 05 ноября 2010

Если вы знаете, сколько итераций вам нужно сделать (в данном случае 10 000), вы наверняка можете вставить счетчик посещений в цикл для n (за одну до ошибки), а затем шаг-через следующую итерацию, используя Intellisense, чтобы дать вам информацию о том, что может вызывать проблемы?

alt text

У вас есть какой-нибудь код, который мы можем увидеть, который может помочь нам помочь вам?

5 голосов
/ 21 сентября 2010

intellitrace в vs2010 может сделать это

http://msdn.microsoft.com/en-us/magazine/ee336126.aspx

1 голос
/ 21 сентября 2010

Нет, отладчик VS не позволяет вам двигаться назад во времени.

Однако взгляните на условные точки останова.Вы можете прервать выполнение цикла в N-е (или N-1-е или любое другое) время или когда будет выполнено определенное условие (например, переменная idx > 1000) и пройти по коду.

1 голос
/ 21 сентября 2010

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

if(somethingThatMightNotHappen) {
    printf("This happened.\n");
    ...
}
0 голосов
/ 12 ноября 2010

Некоторые из этих методов отладки уже были упомянуты, и я не могу гарантировать, что все работают с C ++, но ScottGu имеет хороший список хороших советов в своем блоге .

Полагаю, вы уже знаете об этом, но мне кажется, что вы ищете вкладку стека вызовов в режиме отладки. Вы можете использовать в цикле режим Hit Count или Conditional debugging, и когда появляется ошибка, вы возвращаетесь вниз по стеку вызовов, откуда пришли данные, и устанавливаете несколько точек останова. Затем вы можете снова запустить вашу программу и проверить, как создаются данные.

0 голосов
/ 12 ноября 2010

Попробуйте поймать исключение!Просто поместите код внутри цикла в блок try, за которым следует блок catch с точкой останова.

0 голосов
/ 09 ноября 2010

Фреймворк модульного тестирования будет делать то, что вы хотите. Вам нужно создать модульный тест, который запускает функцию, которую вы хотите вызвать. Затем отредактируйте конфигурацию тестового прогона, чтобы включить покрытие кода.

Наконец, после запуска модульного теста (который может представлять собой одну строку кода для выполнения функции), перейдите в окно «Результаты покрытия кода» и выберите параметр «Показать цвет покрытия кода». Выполненный код будет окрашен в синий цвет, а код, который не был выполнен, будет окрашен в красный цвет.

Отличная, а?

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

0 голосов
/ 22 сентября 2010

Если вы настроили профилирование кода в Visual Studio, вы можете настроить его для предоставления информации о покрытии кода, которая даст некоторую информацию, которую вы ищете, но это не поможет решить проблему.

Подход, который я выбрал бы, состоял бы в том, чтобы уменьшить количество циклов до управляемого числа (скажем, 10) и пошагово пройти по коду. Если вы знаете, что ожидаете, я обнаружил, что пошаговое выполнение кода и проверка того, что он выполняет операции, ожидаемые для небольшого набора тестов, проясняет любое странное поведение.

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

  • Ваше состояние меньше, чем равное, а не меньше, чем
  • Вы тестируете на один больше, чем ожидаете
  • ваш массив на один меньше, чем вы ожидаете
  • Вы начинаете считать с 1 и перебираете количество элементов

Off-by-one (последние три) - чуть ли не самая распространенная ошибка в алгоритмах.

...