public
Dbg And Dbgsym
linux/debug/dbg_and_dbgsym.md
Concept Flow
Concept flow
11. -dbg 包(手动创建,旧方法)
22. -dbgsym 包(自动生成,新方法,推荐)
33. 选择 -dbg 还是 -dbgsym?
44. 你应该怎么做?
-dbg 和 -dbgsym 都是用于提供 调试符号(debug symbols) 的,但它们的机制和用途有所不同:
1. -dbg 包(手动创建,旧方法)
- 这是 传统的手动方法,在
debian/control里明确定义一个-dbg包。 - 特点:
- 需要 手动 维护一个
Package: xxx-dbg的debian/control条目。 - 在
debian/rules里手动指定dh_strip --dbg-package=xxx-dbg来生成调试符号。 - 生成的
-dbg包会包含完整的.debug符号文件,通常位于/usr/lib/debug/目录下。 - 安装后,GDB 可以自动找到符号进行调试。
- 缺点:维护麻烦,每个库都要手动管理
-dbg包。
- 需要 手动 维护一个
示例(debian/control 中的 -dbg 定义):
Package: libdzsisai-dbg
Architecture: any
Section: debug
Priority: extra
Depends: libdzsisai (= ${binary:Version}), ${misc:Depends}
Description: debugging symbols for libdzsisai
2. -dbgsym 包(自动生成,新方法,推荐)
- 这是 Debian 新推荐的方法,使用
dh_strip --dbgsym-migration自动生成-dbgsym包。 - 特点:
- 无需手动定义
-dbgsym包,它会自动创建。 - 自动存放在
ddebs仓库(如果启用了deb.dpkg.org),可以远程安装。 - 更轻量,仅包含调试符号,不包含多余的符号信息。
- 包名格式:
xxx-dbgsym,用于替代xxx-dbg。 - 优点:更自动化、更易维护、不需要手动修改
debian/control。 - 适用于
dh兼容的debian/rules方式。
- 无需手动定义
使用 -dbgsym 方式的 debian/rules 示例:
export DEB_BUILD_MAINT_OPTIONS = hardening=+all debug
override_dh_strip:
dh_strip --dbgsym-migration='libdzsisai-dbg (<< 1.2.3-1~)'
这样,libdzsisai-dbg 旧包会被 libdzsisai-dbgsym 取代,而不影响用户升级。
3. 选择 -dbg 还是 -dbgsym?
| 方式 | -dbg(旧方法) | -dbgsym(新方法,推荐) |
|---|---|---|
| 维护方式 | 手动 添加 debian/control 里定义的 -dbg 包 | 自动 由 dh_strip --dbgsym-migration 生成 |
| 生成方式 | dh_strip --dbg-package=xxx-dbg | dh_strip --dbgsym-migration=xxx-dbg |
| 安装方式 | apt install xxx-dbg | apt install xxx-dbgsym(需启用 ddebs 仓库) |
| 存储位置 | /usr/lib/debug/ | /usr/lib/debug/.build-id/ |
| 适用情况 | 适用于老旧包 | 适用于现代 Debian/Ubuntu 包 |
| 推荐使用 | ❌ 不推荐 | ✅ 推荐 |
4. 你应该怎么做?
如果你在维护 Debian 包,推荐迁移到 -dbgsym,因为它更简单且自动化。
你目前的 git diff 显示:
- 删除了
-dbg包(debian/control里删掉了libdzsisai-dbg)。 - 在
debian/rules里开启了debug(可能影响CFLAGS)。
👉 下一步建议:
-
如果你希望
-dbgsym方式工作,修改debian/rules:override_dh_strip: dh_strip --dbgsym-migration='libdzsisai-dbg (<< 1.2.3-1~)'然后重新打包,检查
*.deb目录里是否有libdzsisai-dbgsym_*_*.deb。 -
如果只是为了本地调试,不发布调试包,可以直接设置:
export DEB_CFLAGS_MAINT_APPEND = -g这样编译时会带
-g选项,你可以直接在build目录下用 GDB 调试。
总结
✔ 想简化维护? 用 -dbgsym,它是 Debian/Ubuntu 现代推荐方式
✔ 还在维护老旧 Debian 包? 那才需要 -dbg,但一般不建议新项目用
✔ 只想本地调试? export DEB_CFLAGS_MAINT_APPEND=-g 即可,不用 -dbg 或 -dbgsym
你是想用 -dbgsym 方式,还是只是想让 dpkg-buildpackage 生成带 -g 的调试信息?