Linux上LLDB无法步入共享库函数的问题求助
LLDB 14.0.4无法步入Linux共享库函数的解决方法
问题背景
在ArchLinux(最新版)和CentOS 7系统上,自行编译LLVM 14.0.4标签版本的LLDB后,调试本地编译的共享库时出现异常:使用s命令尝试步入共享库的add函数时,LLDB会跳转到汇编代码而非源码;但相同环境下GDB可正常步入,且macOS 12.5上的LLDB功能正常。
最小复现代码与编译流程如下:
代码文件
// main.cpp #include "mylib.h" int main(int argc, char *argv[]) { add(argc, argc ^ 0xFF); add(argc, argc ^ 0xFF); return 0; }
// mylib.h int add(int a, int b);
// mylib.cpp int add(int a, int b) { return a ^ b & b; }
Makefile
all: clang++ mylib.cpp -O0 -g3 -shared -fpic -o mylib.so clang++ main.cpp -O0 -g3 mylib.so -o main
调试步骤
LD_LIBRARY_PATH=. lldb main加载程序b main设置主函数断点r启动程序,到达add调用行时执行s,进入汇编代码而非源码
解决方法
1. 确保LLDB编译时依赖完整
LLDB对Linux动态库调试依赖libunwind、libelf等组件,编译LLVM/LLDB时需显式开启相关支持:
- ArchLinux:先安装依赖包
libunwind、libelf、zlib、ncurses,再用CMake配置编译:cmake -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ -DLLVM_ENABLE_PROJECTS="lldb" \ -DLLDB_ENABLE_LIBUNWIND=ON \ -DLLDB_ENABLE_LIBELF=ON \ -DLLVM_ENABLE_RUNTIMES="libunwind" \ ../llvm ninja - CentOS 7:先安装EPEL源和开发包:
再执行上述CMake配置与编译步骤。yum install epel-release yum install libunwind-devel elfutils-libelf-devel ncurses-devel zlib-devel
2. 修改共享库编译命令,明确SONAME
编译共享库时添加-Wl,-soname,mylib.so参数,帮助LLDB正确识别库的符号:
修改后的Makefile:
all: clang++ mylib.cpp -O0 -g3 -shared -fpic -Wl,-soname,mylib.so -o mylib.so clang++ main.cpp -O0 -g3 ./mylib.so -o main
3. 调试时手动加载共享库符号
启动LLDB后,在程序运行前手动加载共享库符号:
target modules load ./mylib.so
或者在程序启动后执行:
process load ./mylib.so
之后再尝试步入add函数,LLDB将正确关联源码。
4. 开启共享库加载自动暂停
设置LLDB在共享库加载时自动暂停,确保符号被正确解析:
settings set target.process.stop-on-shared-library-events true
启动程序后,LLDB会在加载mylib.so时暂停,此时再执行步入操作即可正常进入源码。
内容的提问来源于stack exchange,提问作者zqer
相关产品推荐
相关产品推荐

