程序死锁问题定位(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 库的代码布局不同(如优化导致函数地址变化),调试时可能会看到不一致的行为。