必须先执行run或start让程序运行至加载动态库阶段,否则info sharedlibrary显示“no shared libraries loaded”;若用dlopen延迟加载,需运行到dlopen调用完成后再查。

info sharedlibrary 显示“No shared libraries loaded”怎么办
这通常不是符号没加载,而是程序根本还没开始运行——GDB 启动后若只执行 file 或 target,动态库压根不会被载入。必须让程序至少走到 _dl_start 或 main 之前,系统才会触发共享库加载。
常见错误现象:(gdb) info sharedlibrary 返回 No shared libraries loaded at this time.
- 先执行
start或run,等程序停在入口点(如main)后再查 - 如果程序用
dlopen延迟加载,得运行到dlopen("libxxx.so", RTLD_NOW)执行完才真正映射 - 确认二进制本身链接了该库:
ldd ./a.out | grep libxxx,否则 GDB 根本不会尝试加载
add-symbol-file 手动加载符号的三个必要参数
add-symbol-file 不是“指定 so 文件路径就行”,它需要三要素:符号文件路径、内存加载基址、代码段偏移。缺一不可,否则断点无效或崩溃。
容易踩的坑:直接 add-symbol-file ./libxxx.so 报错 Address not in inferior's memory space。
- 先用
info sharedlibrary查出库的加载地址(From列),例如0x00007ffff7dd1700 - 再用
readelf -S ./libxxx.so | grep '\.text'找代码段(.text)的Offset,比如是0x6a0 - 最终命令是:
add-symbol-file ./libxxx.so 0x00007ffff7dd1700 + 0x6a0(注意加法要手动算,GDB 不解析表达式) - 如果只有
.debug分离文件(如libxxx.so.debug),就用它替代.so路径,基址仍取运行时地址
solib-search-path 和 sysroot 的区别与误用场景
这两个命令都影响 GDB 查找共享库的行为,但作用机制完全不同,混用会导致符号反复丢失。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
典型错误:把 set sysroot /path/to/sysroot 设成本地开发环境路径,结果 GDB 去 /path/to/sysroot/lib/x86_64-linux-gnu/libc.so.6 找,而实际进程加载的是 /lib/x86_64-linux-gnu/libc.so.6,匹配失败。
-
set solib-search-path /custom/lib:/another/lib:只用于搜索dlopen加载的相对路径库(如"./libxxx.so"),对编译期链接的绝对路径库无效 -
set sysroot /path/to/target/root:仅当调试嵌入式或 chroot 环境时使用,GDB 会把所有绝对路径库(如/lib/ld-linux.so.2)自动拼上前缀;设错会导致标准 C 库符号全丢 - 优先用
set solib-search-path解决自定义 so 路径问题;sysroot应严格对应目标系统根目录结构
catch load libxxx.so 比 info sharedlibrary 更早捕获加载时机
想在共享库刚映射进内存、还没执行任何初始化函数时就下断点?info sharedlibrary 必须等库已加载完毕才能看到,而 catch load 是唯一能抢在 _init 之前介入的方式。
为什么不用 break dlopen?因为有些库由 linker 自动加载(如 -lxxx),根本不会调用 dlopen。
-
catch load libxxx.so:命中后,GDB 自动停在dl_open_worker内部,此时库已 mmap 进内存,但.init段尚未执行 - 停住后立刻执行
info proc mappings,就能拿到该库准确的内存区间,再配合add-symbol-file加载符号 - 若只写
catch load(不带库名),会捕获所有库加载,适合排查依赖顺序或隐式加载行为
真正麻烦的永远不是“怎么加符号”,而是你不确定符号该加在哪——动态库可能被 mmap 多次(ASLR)、可能被 dlclose 卸载、也可能被多个 dlopen 句柄引用。每次 info sharedlibrary 输出的地址都可能变,别依赖一次结果做长期判断。










