Libcwd


Libcwd — это библиотека C++, написанная Карло Вудом для добавления поддержки отладки во время выполнения приложений C++ , особенно кода, разработанного с помощью коллекции компиляторов GNU . Функционал, который библиотека добавляет в приложение, можно разделить на три категории:

Хотя сам код библиотеки старается строго соответствовать ISO C++ и максимально соответствовать POSIX , для достижения пунктов 2 и 3 необходим довольно специализированный код, специфичный для архитектуры, на которой работает приложение. По этой причине Libcwd ограничивает себя узкой архитектурой: он должен быть скомпилирован с помощью компилятора GNU и требует, чтобы объектный код был 32- или 64-битным ELF , а компилятор генерировал отладочную информацию в формате DWARF-2 .

В результате компиляции libcwd создаются две библиотеки: потокобезопасная ( libcwd_r) и версия (libcwd) без поддержки потоков. Потокобезопасная версия зависит от еще большего количества деталей, специфичных для архитектуры (а именно, от библиотеки GNU C). В результате полнофункциональная библиотека libcwd в основном подходит только для разработки на платформах Linux .

Однако libcwd можно настроить так , чтобы отказаться от поддержки потоков, отладки выделения памяти и/или чтения отладочной информации ELF и DWARF-2 — до тех пор, пока не останется только поддержка вывода отладки ostream. Таким образом, можно использовать его для разработки приложения на Linux до тех пор, пока оно не станет надежным, и при этом иметь отладочные данные на других (POSIX) платформах, даже если полноценная библиотека libcwd там недоступна — при условии, что потокобезопасность не требуется. для вывода отладки на этих платформах: два или более потоков, записывающих вывод отладки в один и тот же поток, могут привести к довольно беспорядочному выводу, когда вывод одной строки начинается в середине другой без поддержки потоков.

Libcwd предоставляет несколько макросов, которые легко расширяются, позволяя пользователю делать практически все, что он обычно может делать с потоками ostreams. Однако если вы хотите просто записать отладочный вывод, двух макросов будет достаточно: Dout и DoutFatal. Последний должен использоваться для фатального вывода отладки, после чего приложение необходимо закрыть. Например:

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