Введение

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

Отладочный вывод на основе ostream. Доступ к отладочной информации во время выполнения. Доступ к управлению выделением памяти во время выполнения.

Поддерживаемые платформы

Хотя сам библиотечный код стремится строго соответствовать 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 там недоступен, при условии, что потокобезопасность не требуется для вывода отладочной информации на этих платформах: два или более потока, одновременно записывающих отладочный вывод в один и тот же ostream, могут привести к хаотичному выводу, когда начало одной строки оказывается в середине другой, при отсутствии поддержки потоков.

Доступ к информации о отладке в режиме выполнения

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

PERSIST : PersistXML::serialize builtin<std::string>("M hostname", @0xbfc1f214) вызывается.