运行GLib应用程序

运行GLib应用程序 — 如何运行和调试GLib应用程序

运行和调试GLib应用程序

环境变量

GLib 会检查除了像 LANG, PATH or HOME 一样的标准环境变量之外的一小部分环境变量.

G_FILENAME_ENCODING 这个环境变量可以被设置为逗号为分隔字符集名称的列表. GLib 假设文件名编码是以此列表第一个变量指定的编码方式而不是UTF-8. 特别标记 "@locale" 可用于指定当前语言环境的字符集编码.

G_BROKEN_FILENAMES 如果设置了这个环境变量,GLib 假设文件名为当前语言环境编码而不是UTF-8. G_FILENAME_ENCODING 优先于 G_BROKEN_FILENAMES.

G_MESSAGES_PREFIXED 日志级别的信息的前缀应该是程序名和程序的PID.默认前缀是除了G_LOG_LEVEL_MESSAGEG_LOG_LEVEL_INFO的一切.

G_DEBUG 如果 GLib 已经定义了 --enable-debug=yes, 这个变量可用于设置调试选, 将打印出调试信息中的各种类型.

fatal_warnings

首次调用g_warning()或 g_critical()即中止程序的运行.特别地,此选项不需要GLib配置成 调试支持.

fatal_criticals

首次调用g_critical()即中止程序的运行. 此选项不需要GLib配置成 调试支持.

gc-friendly

新分配的内存没有被直接初始化,内存释放后将被重置为0. 这里的要点是允许内存检查系统和使用bohem GC 类似算法 的程序来计算更多精确的結果.此选项比较特殊,不需要将 GLib配置成调试支持.

resident-modules

所有由GModule加载的模块将长驻内存的. 这可用于在模块卸载后追踪模块的内存泄漏. 但也可能在模块正常卸载后隐藏代码访问时的bugs. 此选项比较特殊,不需要将GLib配置成调试支持.

bind-now-modules

所有模块被GModule加载时就会绑定他们的符号,即使代码使用了 %G_MODULE_BIND_LAZY. 此选项比较特殊,不需要将GLib配置成调试支持.

特殊值可以用来打开所有的调试选项. 特殊值可以用来打印所有可用的选项.

G_SLICE  该环境变量允许重新配置GSlice内存分配器.

always-malloc

 这将导致所有通过g_slice_alloc()和g_slice_free1()操作的片分配器将  直接调用g_malloc()和g_free()来分配.这对于内存检查系统和使用Bohem GC  算法的相关程序计算更精确的結果最有帮助.  它还可以连接系统malloc实现中的调试特性,比如glibc中的MALLOC_CHECK_=2, 然后来调试错误的片分配代码,即使debug-blocks通常是 更适合的调试工具.

debug-blocks

使用此选项(出现自GLib-2.13)执行额外的代码将在释放内存片时进行完整 性检查.无效的片地址或片大小将会被报告并导致程序停止。此选项用于调试 方案.特别地,客户端软件包在运行自有的测试套件时应该始终打开此选项. 全局片验证是为了确保存储每个分配块的大小和地址信息,并为此数据维护 一个全局的哈希表.因此,多线程的可扩展性被放弃,而且内存消耗增加.然而 生成的代码通常表现得更好,可能比同类使用外部工具检查内存的还要好. 在一个内存损坏的情况下,G_SLICE=always-malloc将不能进行复制, 但设置G_SLICE=debug-blocks将能如下面一样捕获:

		    void *slist = g_slist_alloc(); /* void* gives up type-safety */
		    g_list_free (slist);           /* corruption: sizeof (GSList) != sizeof (GList) */
		  

特殊值可以用来打开所有的调试选项. 特殊值可以用来打印所有可用的选项.

G_RANDOM_VERSION  如果这个环境变量设置为 '2.0'. GLib-2.0中已经过时的伪随机播种和生成  算法将会替代新的算法. 只有你需要精确重现GLib-2.0生成的数字序列时才  使用GLib-2.0的算法.

LIBCHARSET_ALIAS_DIR  允许为charset.aliases文件指定一个非标准的位置, 这文件通常用于字符集转换全程.默认位置是编译时指定的libdir.

TZDIR Allows to specify a nonstandard location for the timezone data files that are used by the #GDateTime API. The default location is under /usr/share/zoneinfo. For more information, also look at the tzset manual page.


区域设置

相当数量的GLib接口取决于应用程序在运行时的当前区域设置. 因此大多数使用GLib的程序应该调用setlocale(LC_ALL,"") 来设置当前区域.

在Windows中,C程序中有几个区域设置的概念并不是同步的. 一方面,有系统默认的ANSI代码页,由C库和Win32API来决定用什么 编码来处理文件名.(我们现在谈论的是"窄"函数处理字符指针,不是 "宽"的那种.)

另一方面,有一个C函数库的 当前区域.该字符集(代码页)并不一定像 系统默认ANSI代码页一样使用.它返回的字符集类似strftime().


陷阱与追踪

在GLib配置好--enable-debugging=yes 的调试中,有些包含陷阱变量的代码可被设置.这些陷阱导致代码停止检查 当前的程序状态并回溯.

当前,有下列陷阱变量存在:

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

如果设置 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字节的时候才中断它.


Gdb debugging macros

glib ships with a set of python macros for the gdb debugger. These includes pretty printers for lists, hashtables and gobject types. It also has a backtrace filter that makes backtraces with signal emissions easier to read.

To use this you need a recent enough gdb that supports python scripting. Gdb 7.0 should be recent enough, but branches of the "archer" gdb tree as used in Fedora 11 and Fedora 12 should work too. You then need to install glib in the same prefix as gdb so that the python gdb autoloaded files get installed in the right place for gdb to pick up.

General pretty printing should just happen without having to do anything special. To get the signal emission filtered backtrace you must use the "new-backtrace" command instead of the standard one.

There is also a new command called gforeach that can be used to apply a command on each item in a list. E.g. you can do

gforeach i in some_list_variable: print *(GtkWidget *)l

Which would print the contents of each widget in a list of widgets.


SystemTap

SystemTap is a dynamic whole-system analysis toolkit. GLib ships with a file glib.stp which defines a set of probe points, which you can hook into with custom SystemTap scripts. See the files glib.stp and gobject.stp which are in your shared SystemTap scripts directory.


静态内存

如果内存分析已在启动时通过 g_mem_set_vtable(glib_mem_profiler_table) 启动,g_mem_profile() 将输出g_malloc()的内存使用摘要.

如果GLib已经配置了选项--enable-debug=yes, 那么在调试器中则可以调用g_slice_debug_tree_statistics()来查看 内存片使用的细节.