factorial: result: result is 1
1
?func?: args: argv[3] = 2
factorial: find: find 2 factorial
factorial: find: find 1 factorial
factorial: result: result is 1
factorial: result: result is 2
2
Опция -#
dbug. Она «особая» в том смысле, что DBUG_PUSH() будет принимать всю строку, игнорируя ведущие символы '-#', хотя вы могли бы использовать при желании другую опцию, передав DBUG_PUSH() лишь строку аргументов опций (если вы используете getopt(), это optarg).Управляющая строка состоит из набора опций и аргументов. Каждая группа опций и аргументов отделяется от других символом двоеточия. Каждая опция представлена одной буквой, а аргументы этой опции отделяются от нее запятыми. Например:
$ myprog -#d,mem,ipc:f,check_salary,check_start_date -f infile -o outfile
Опция d
DBUG_PRINT(), но лишь если первая строка аргумента является "mem" или "ipc". (Если аргументов нет, выводятся все сообщения DBUG_PRINT().) Сходным образом опция f ограничивает трассировку вызовов функций лишь указанными функциями, check_salary() и check_start_date().Следующий список опций и аргументов воспроизведен из руководства библиотеки dbug
d [,ключевые слова]
Разрешает вывод от макросов с указанными
F
Помечает каждую строку вывода отладки именем исходного файла, содержащего макрос, осуществляющий вывод.
i
Идентифицирует процесс, выводящий каждую отладочную или трассировочную строку номером ID для этого процесса.
L
Помечает каждую строку вывода отладчика номером строки исходного файла, в котором находится осуществляющий вывод макрос.
о[,файл]
Перенаправляет поток вывода отладчика в указанный файл. Потоком вывода по умолчанию является stderr
stdout.t[,N]
Включает трассировку потока управления функций. Максимальная глубина вложения определяется N
Для завершения нашего обсуждения вот остальные макросы, определенные библиотекой dbug
DBUG_EXECUTE(строка, код)
Этот макрос похож на DBUG_PRINT()
d, а второй — код для исполнения:DBUG_EXECUTE("abort", abort());
DBUG_FILE
Это значение типа FILE*
. Оно позволяет осуществлять собственный вывод в поток файла отладки.DBUG_LONGJMP(jmp_buf env, int val)
Этот макрос заключает в оболочку вызов longjmp()
dbug будет знать, когда вы сделали нелокальный переход.DBUG_POP()
Этот макрос выталкивает из стека один уровень сохраненного состояния отладки, созданный макросом DBUG_PUSH()
DBUG_SETJMP(jmp_buf env)
Этот макрос заключает в оболочку вызов setjmp()
dbug обрабатывать нелокальные переходы.В другом воплощении, в первой начинающей компании, для которой мы работали[177]
, мы использовали в своем продукте библиотекуdbug. Она была неоценимой при разработке, а опустив -DDBUG в конечной сборке, мы смогли построить готовую версию без других изменений исходного кода.Чтобы извлечь максимальную выгоду от библиотеки dbug
awk мы смогли включить библиотеку в программу с 30 000 строк кода за несколько часов работы. Если вы можете позволить себе накладные расходы, лучше всего оставить ее в конечной сборке вашей программы, чтобы можно было ее отлаживать без необходимости предварительной перекомпиляции.Мы нашли, что библиотека dbug
15.5.2. Отладчики выделения памяти