Найдите отладочный файл printf, чтобы удалить его - PullRequest
1 голос
/ 28 июня 2011

Я столкнулся с некоторой проблемой, которую хочу эффективно решить, и, возможно, некоторые из вас тоже научатся этому. Я сделал ошибку, потому что я отлаживал свое приложение, используя отладку printf (или в моем случае, вероятно, std :: cout). Все прошло хорошо, я удалил свою ошибку и попал в другие проблемы. Сейчас я нахожусь на этапе, когда я хочу, чтобы мой вывод отладки исчез, но я больше не могу его найти. Поиск по тексту не поднял его и безнадежен из-за множества неотладочных отпечатков. Кроме того, я не печатал больше значения переменной, поэтому не знаю его имени и не могу найти это конкретное значение, поскольку его нет в исходном коде.

Я помню некоторую аккуратную команду linux, которая регистрирует все системные вызовы в приложении, которое она упаковывает. Можно ли использовать этот инструмент, чтобы найти строки, где происходит отладочная печать? (Я бы использовал это, потому что 90% моего вывода - это отладочный отпечаток, поэтому я думаю, что должен быстро его найти)

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

Спасибо

EDIT Чтобы не комментировать каждого, кто советует мне использовать контроль версий: я уже использую SVN. К сожалению, я не знаю, когда я ввел сообщение об отладке. В худшем случае мой первоначальный коммит уже содержит его.

Ребята из grep: Это не намного лучше, чем текстовый поиск, поскольку он даст мне каждый строка, содержащая print / std :: cout и без контекста, поэтому я даже не могу решить, это линия отладки между всеми остальными.

Всем тем, кто говорит мне / думает, что я глуп, когда делаю такие вещи: хорошо, тот, который я заметил, как только набрал в этом посте;)

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

решаемые

Наконец-то я нашел это, с некоторой удачей. Это был std :: cout, спрятанный где-то вглубь кода (один из базовых классов, в котором было всего несколько включений, все они были системными библиотеками). Я попробовал метод grep с одним -F1, чтобы увидеть какие-либо комментарии, и мне повезло, когда рассматриваемая строка была на экране, когда grep был закончен.

Ответы [ 6 ]

4 голосов
/ 28 июня 2011

Если это printf - создайте макрос, который вызовет printf, добавив к нему имя файла и номер строки (это __FILE__ и __LINE__).Просто назовите макрос printf и вызовите ::printf для исходной функции.

Если это cout - немного сложнее, но вы можете попытаться поставить точку останова там и посмотреть, откуда она вызывается, вы 'Вы найдете его в конце.

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

3 голосов
/ 28 июня 2011

Вам не нужна никакая причудливая система контроля версий! Все, что вам нужно, это самодисциплина, чтобы пометить все (да, все ) выходные данные отладки с помощью комментария / * REMOVE ME * /.

Мне понадобилось всего 30 лет, чтобы выучить это.

1 голос
/ 28 июня 2011

Если вы находитесь в Linux, вы можете использовать grep для анализа всего кодового дерева в единицах и позволить вам показывать каждое попадание для "std :: cout".Если вы разрешите печатать только одно значение, вы должны увидеть соответствующую строку очень быстро.

Или вы можете искать регулярное выражение, если вы знаете, что "не было" в вашей строке отладки: s/std\:\:cout\b[^"]*std\:\:endl/.

Чтобы обнаружить изменения в SVN: используйте svn-bisect

1 голос
/ 28 июня 2011

Вы хотели лучшего способа:

Используйте контроль версий! Затем измените свою рабочую копию против вашей базовой ревизии; при условии, что вы не внесли миллионы изменений, вам будет легко найти ваш printf.

UPDATE

Если вы не знаете, в какую ревизию вы добавили это поведение, просто выполните бинарный поиск. Запустите ваше приложение с ревизией 1000 (например), затем 500, затем 750, затем 625 и т. Д. И т. Д. Это действительно тот же самый подход, что и определение момента времени, когда была введена ошибка.

1 голос
/ 28 июня 2011

Эта страница: http://sclogger.sourceforge.net/ есть программа, позволяющая регистрировать системные вызовы. Может быть, это то, что вы ищете.

В будущем вы можете сделать что-то вроде следующего.

#ifdef DEBUG
std::cout << "Debugging message" << std::endl;
#endif

Вы можете контролировать, определяется ли символ DEBUG во время компиляции.

0 голосов
/ 28 июня 2011

Как правило, у меня всегда есть что-то вроде этого:

#ifdef DEBUG
int dbg_printf(char * format, ...) {

    va_list ap;
    va_start(ap, format);

    vsnprintf(my_printf_buf, my_printf_bufsize, format, ap);
    uart3_putstr(my_printf_buf); // debug connector

    va_end(ap);

    return 0;
}
#else
#define dbg_printf(format, ...)
#endif 

Хорошо, что когда вы не отлаживаете, все те dbg_printf (), которые есть в вашем коде, съедаются-процессор и не раздутый код.

...