2010-02-02 2 views
2

по дизайну, в среде, в которой я работаю прямо сейчас. Я не могу использовать отладчик, чтобы попытаться обнаружить ошибки, поэтому почти всегда, когда мне нужно отлаживать функциональность, я в конечном итоге выводя некоторую информацию.Как реализовать выровненную систему отладки?

Чтобы сделать это, я сделал следующее:

#ifdef DEBUG 
    #define printd(x) printf x 
#else 
    #define printd(x) 
#endif 

Так что, когда мне нужно напечатать некоторую информацию отладки я использую printd() вместо printf().

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

Так что мой вопрос в том, как я могу реализовать систему отладки с выравниванием? Я ценю простоту, я имею в виду, я предпочитаю свою реальную систему, чем при использовании большого количества кода или запутывающего кода. Что-то вроде printd(level, format, ...) было бы потрясающе.

ответ

6

Конечно, есть более элегантные способы сделать это, конечно, но это работает просто отлично

#ifdef DEBUG 
extern int g_debuglevel; 
#define printd(level, x) (level <= g_debuglevel) ? 0 : printf x 
#else 
#define printd(level, x) 
#endif 

Хотя лично я предпочитаю этот

#ifdef DEBUG 
extern void printdf(level, fmt, ...); 
#define printd printfd 
#else 
#define printd 
#endif 

где printdf является функция, которая тестирует и затем вызывает vprintf, проходящий по fmt и va_args.

+1

Есть веские основания для обеспечения того, чтобы код всегда расширяется так, что компилятор всегда компилирует код отладки технического обслуживания. Используйте 'if (0) {... debug printing ...}' или эквиваленты. Это значительно снижает вероятность того, что отладка будет нарушена, когда вы ее активируете, что может быть годами после последнего раза. –

+0

@Johnathon: На самом деле, я немного упростил код, который он разместил. мой фактический макрос отладки расширяется до некоторого кода, определяется ли debug или нет. один урок за раз. –

+0

@Johnathon: Кроме того, построение отладки и розничной торговли при каждой проверке решает проблему обслуживания без затрат на раздувание розничного кода с помощью отладочной информации. –

1

Смотреть ответы:

Это даст вам много указателей на то, что делать.

+0

Да, вы можете создавать новые вещи с помощью компилятора, совместимого с C99, но у большинства из нас этого пока нет. –

+0

@ Джона Кноэллера: Как я уже указывал в своем ответе на первый из двух перечисленных вопросов, для C89 существует вполне жизнеспособное решение, которое я использовал еще пару лет назад. Это не так аккуратно и аккуратно, как решение C99 с использованием аргументов макроса '__VA_ARGS__', но это, безусловно, работает. –

+0

Спасибо! В конце концов я сделал что-то похожее, и теперь я теперь лучше разрешить компилятору видеть код отладки в сборках релизов. –

1

Если вы хотите перейти на дополнительный шаг и зарегистрировать свои заявления об отладке уровня, вы можете попробовать log4c. http://log4c.sourceforge.net/

в функции printfd, описанной выше, вы также можете проверить переменную окружения, чтобы DEBUG_LOG_LEVEL динамически включал и выключал ведение журнала.

Я использовал подобную технику для реализации облегченной иерархической библиотеки регистрации для встроенной среды Linux.

Также для примера log4c - http://log4c.sourcearchive.com/documentation/1.2.1/helloworld_8c-source.html Благодаря поиску Google :)

+0

Спасибо! Но, по крайней мере, на данный момент (это небольшой проект), для меня достаточно простого журнала. –

Смежные вопросы