Administrator
发布于 2025-08-29 / 9 阅读
0
0

gdb调试手段

程序死锁问题定位(Debug版本库加载)

1.获取进程ID

ps -ef | grep 进程名称

2.gdb调试

gdb attach 进程ID

3.查看进程当前加载的库及其内存地址

(gdb) info sharedlibrary

输出:

0x00007ffff7aab000 0x00007ffff7ccd000 /usr/lib/x86_64-linux-gnu/libexample.so

记录下 libexample.so 的加载地址 0x7ffff7aab000**(后续替换 Debug 库时需要)。

或者:

cat /proc/<PID>/maps | grep libexample.so | grep r-xp

add-symbol-file 需要的是 代码段的加载基地址(即 r-xp 的起始地址)

全量输出示例

0x7ffff7aab000 0x7ffff7acb000 r-xp /path/to/libexample.so # 代码段(关键!)

0x7ffff7acb000 0x7ffff7ccb000 r--p /path/to/libexample.so # 只读数据段

0x7ffff7ccb000 0x7ffff7ccf000 rw-p /path/to/libexample.so # 数据段

4.**强制加载 Debug 版本的符号** 覆盖现有符号

(gdb) add-symbol-file /path/to/debug/libexample_debug.so 0x7ffff7aab000

- 此方法 不会替换内存中的代码,只是让 GDB 使用 Debug 版本的符号信息(如函数名、行号、变量等)。

- 如果 Debug 和 Release 库的代码布局不同(如优化导致函数地址变化),调试时可能会看到不一致的行为。


评论