能否从gtkmm、glibmm运行时诊断消息中获取行号或堆栈信息?
GLib 诊断信息添加源代码行号实现方案
完全可以实现,你可以通过以下几种方式配置,让GLib输出的CRITICAL、WARNING类诊断信息附带对应源代码的行号:
- 第一步先确保程序编译时保留了调试符号:编译参数添加
-g,如果使用Meson构建项目,将buildtype设置为debug即可保留完整的行号、符号信息 - 无需修改代码的调试方式:
- 运行程序前设置环境变量
G_DEBUG=fatal-criticals,触发CRITICAL级别报错时程序会直接崩溃,你可以用gdb加载coredump或者直接用gdb运行程序,就能直接拿到报错位置的完整调用栈和对应行号 - 不希望程序崩溃的话,可以直接用gdb运行程序,给
g_log函数打断点,每次GLib输出诊断信息时gdb会自动停住,执行bt命令即可打印完整调用栈,定位到源代码的具体行
- 运行程序前设置环境变量
- 希望直接在日志输出中自带行号的话,可以在代码全局注册自定义日志处理函数:通过
g_log_set_default_handler注册自定义回调,在回调中调用g_backtrace系列接口抓取当前调用栈,解码后和日志内容一起输出即可,不需要依赖gdb就能直接在运行日志中看到行号
上述调试配置仅适用于开发场景,正式发布版本不要开启,会产生额外的性能开销,也会暴露程序内部实现信息。
内容的提问来源于stack exchange,提问作者越鸟巢南枝
相关产品推荐
相关产品推荐

