Libcwd - Libcwd

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

  1. Ostream вывод отладки на основе.
  2. Доступ во время выполнения к отладочной информации.
  3. Доступ во время выполнения к выделение памяти администрация.

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

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

Вывод отладки на основе Ostream

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

  если (ошибка)    DoutFatal(Округ Колумбия::фатальный, «Произошла неустранимая ошибка».);

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

Простой вывод отладки записывается с использованием Dout следующим образом:

  Dout(Округ Колумбия::уведомление, "звонил из" << location_ct(CALL_ADDR));

где второй параметр может содержать «<<» для записи любого типа или объекта в поток вывода отладки (в данном случае location_ct).

«Dc :: fatal» и «dc :: notice» - это «каналы» отладки, которые можно включить или выключить. Пользователь может создавать и использовать любое количество настраиваемых каналов отладки в дополнение к по умолчанию. Также возможно создать больше, чем просто объект ostream вывода отладки по умолчанию 'libcw_do', и, таким образом, записать вывод более чем в один поток ostream. Каждый объект отладки, представляющий поток, может, в свою очередь, отдельно включаться и выключаться.

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

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

 PERSIST: вызывается PersistXML :: serialize_builtin  ("M_hostname", @ 0xbfc1f214).

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

Libcwd осуществляет внутреннее администрирование распределения памяти. Это позволяет делать такие вещи, как утечка памяти проверка, распечатка обзора выделенной памяти (очень мощным способом, позволяющим фильтровать что угодно: регулярные выражения для имен библиотек, имена функций (размеченные или нет) и / или временные интервалы, в течение которых было выполнено выделение).

Библиотека также предоставляет несколько глобальных функций, которые можно вызывать из отладчика, например GDB, позволяя разработчику быстро определить, на какое выделение указывает данный указатель. Например,

 (gdb) call cwdebug_alloc (0x8a19450) 0x8a19450 точек внутри выделения памяти, которое начинается с 0x8a19448 start: 0x8a19448 size: 12 type: char ** description: массив аргументов командной строки, переданных в libcw_app_ct :: options_done_event. расположение: libcw_app.cc:304 в функции: libcw_app_ct :: libcw_init (int, char * const *) когда: 00: 31: 09.888760 (gdb) l libcw_app.cc:304

внешняя ссылка