Выполнение GLib приложения

Running GLib Applications — Как выполнять и отлаживать GLib приложение

Выполнение и отладка GLib приложений

Переменные окружения

GLib проверяет несколько переменных окружения в дополнение к стандартным переменным таких как LANG, PATH или HOME.

G_FILENAME_ENCODING Эта переменная окружения может определять разделённый запятыми список имён наборов символов. GLib предполагает что имена файлов находятся в кодировке первого набора символов в этом списке вместо UTF-8. Специальная лексема "@locale" может использоваться для определения набора символов текущей локали (locale).

G_BROKEN_FILENAMES Если эта переменная окружения установлена, GLib предполагает что имена файлов находятся в кодировке локали (locale) вместо UTF-8. G_FILENAME_ENCODING имеет приоритет над G_BROKEN_FILENAMES.

G_MESSAGES_PREFIXED Список регистрационного уровня для которого сообщения должны быть предустановленны именем программы и PID приложения. По умолчанию с префиксом все кроме G_LOG_LEVEL_MESSAGE и G_LOG_LEVEL_INFO.

G_DEBUG Если GLib сконфигурирована с --enable-debug=yes, эта переменная может быть установлена в список отладочных опций, которые заставят GLib печатать различную отладочную информацию.

fatal_warnings

Заставит GLib прервать программу при первом вызове g_warning() или g_critical(). Особенность опции в том, что не требуется конфигурация GLib с поддержкой отладки.

fatal_criticals

Заставит GLib прервать программу при первом вызове g_critical(). Особенность опции в том, что не требуется конфигурация GLib с поддержкой отладки.

gc-friendly

Вновь распределенная память которая непосредственно не инициализирована, также как освобождаемая память будет сброшена в 0. Позволяет проверочным программам памяти и подобным программам использующим алгоритмы подобные GC (сборщик мусора) произвести более точные результаты. Особенность опции в том, что не требуется конфигурация GLib с поддержкой отладки.

resident-modules

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

bind-now-modules

Все модули загруженные GModule свяжут свои идентификаторы во время загрузки, даже когда код использует %G_MODULE_BIND_LAZY. Особенность опции в том, что не требуется конфигурация GLib с поддержкой отладки.

G_SLICE Эта переменная окружения позволяет переконфигурировать #GSlice программу распределения памяти (memory allocator).

always-malloc

Это заставит все участки распределённые через g_slice_alloc() и освобожденные с помощью g_slice_free1() фактически распределяться непосредственно через вызовы g_malloc() и g_free(). Позволяет проверочным программам памяти и подобным программам использующим алгоритмы подобные GC (сборщик мусора) произвести более точные результаты. Может также связать с отладочной особенностью реализации системы malloc такой как glibc's MALLOC_CHECK_=2 для отладки кода ошибочно распределенных участков.

G_RANDOM_VERSION Если эта переменная установлена в '2.0', будут использоваться устаревшие алгоритмы генерирования псевдо-случайных чисел из GLib-2.0 вместо улучшенных новых. Используйте GLib-2.0 алгоритмы только если вы генерировали последовательность чисел с помощью Glib-2.0 которую вам нужно воспроизвести в точности.

LIBCHARSET_ALIAS_DIR Позволяет специфичное не стандартное расположение для charset.aliases файла который используется подпрограммами конвертации наборов символов. По умолчанию расположение определяет libdir во время компиляции.

G_WIN32_PRETEND_WIN9X Установка этой переменной в любое значение заставит g_win32_get_windows_version() возвращать версию кода для Windows 9x. Это главным образом для внутренней отладки GTK+ и GLib, позволяет разработчикам проверить код для Windows 9x.


Ловушки и трассировка (Traps and traces)

Некоторые части кода содержат переменные "ловушки" которые могут быть установлены во время отладки если GLib сконфигурирована с --enable-debug=yes. Такие "ловушки" приводят к непосредственной остановки кода для исследования текущего состояния программы и отслеживания (backtrace).

В настоящее время существуют следующие переменные "ловушки":

static volatile gulong g_trap_free_size; static volatile gulong g_trap_realloc_size; static volatile gulong g_trap_malloc_size;

Если установлен размер > 0, g_free(), g_realloc() и g_malloc() будут прерваны, если размер будет соответствовать размеру блока памяти. Это работает только с g_mem_set_vtable (glib_mem_profiler_table) во время старта, потому что профиль памяти требует соответствия в размерах блоков памяти.

Помните что многие современные отладчики поддерживают условные точки остановки, которые выполняют аналогичные функции. Например в gdb, вы можете сделать следующее

break g_malloc condition 1 n_bytes == 20

для остановки только в g_malloc() вызове где размер распределяемого блока равен 20.