lldb 无法在导入的 dylib 中查找符号
lldb cannot lookup symbol in imported dylib
我正在使用 lldb 在 arm64 上调试 C 程序,为了实现我自己的调试功能,我编写了一个独立的调试帮助程序,将其编译为 dylib 并使用以下方法将其导入 lldb:
(lldb) target modules add debugHelper.dylib
然而当我调用dylib中声明的函数时,lldb错误:
(lldb) expression debugPrint()
error: Couldn't lookup symbols:
_debugPrint
如果我输入随机函数名称(例如 foo):
(lldb) expression foo()
error: use of undeclared identifier 'foo'
,这让我相信导入 dylib 确实成功了,因为 debugPrint
不是 undeclared identifier
。
// debugHelper.c
#include <stdio.h>
int debugPrint() {
printf("%s\n", "Debug info printed! \n");
return 0;
}
debugHelper.dylib 编译为:
$ xcrun --sdk iphoneos cc debugHelper.c -o debugHelper.dylib -dynamiclib -arch arm64 -g
我还用 nm
验证了 debugHelper.dylib 确实有 _debugPrint
符号:
$ nm debugHelper.dylib
0000000000007f2c T _debugPrint
U _printf
U dyld_stub_binder
(lldb) image list
的结果:
[263]... debugHelper.dylib.dSYM/Contents/Resources/DWARF/debugHelper.dylib
target modules add
将二进制文件(及其 dSYM,如果有的话)加载到它知道的 lldb 二进制文件池中。但是 dylib 还没有加载到你的下级进程中——你将无法 运行 那里的功能。
相反,运行 dlopen()
在您的过程中:
(lldb) p (int)dlopen("debugHelper.dylib", 10)
(即 10 是 RTLD_GLOBAL|RTLD_NOW
,诉 dlfcn.h
)。还有一个 SB API 方法可以做到这一点,SBProcess::LoadImage
不需要您查找 dlopen
的详细信息。例如
(lldb) script lldb.process.LoadImage(lldb.SBFileSpec("debugHelper.dylib", False), lldb.SBError())
我正在使用 lldb 在 arm64 上调试 C 程序,为了实现我自己的调试功能,我编写了一个独立的调试帮助程序,将其编译为 dylib 并使用以下方法将其导入 lldb:
(lldb) target modules add debugHelper.dylib
然而当我调用dylib中声明的函数时,lldb错误:
(lldb) expression debugPrint()
error: Couldn't lookup symbols:
_debugPrint
如果我输入随机函数名称(例如 foo):
(lldb) expression foo()
error: use of undeclared identifier 'foo'
,这让我相信导入 dylib 确实成功了,因为 debugPrint
不是 undeclared identifier
。
// debugHelper.c
#include <stdio.h>
int debugPrint() {
printf("%s\n", "Debug info printed! \n");
return 0;
}
debugHelper.dylib 编译为:
$ xcrun --sdk iphoneos cc debugHelper.c -o debugHelper.dylib -dynamiclib -arch arm64 -g
我还用 nm
验证了 debugHelper.dylib 确实有 _debugPrint
符号:
$ nm debugHelper.dylib
0000000000007f2c T _debugPrint
U _printf
U dyld_stub_binder
(lldb) image list
的结果:
[263]... debugHelper.dylib.dSYM/Contents/Resources/DWARF/debugHelper.dylib
target modules add
将二进制文件(及其 dSYM,如果有的话)加载到它知道的 lldb 二进制文件池中。但是 dylib 还没有加载到你的下级进程中——你将无法 运行 那里的功能。
相反,运行 dlopen()
在您的过程中:
(lldb) p (int)dlopen("debugHelper.dylib", 10)
(即 10 是 RTLD_GLOBAL|RTLD_NOW
,诉 dlfcn.h
)。还有一个 SB API 方法可以做到这一点,SBProcess::LoadImage
不需要您查找 dlopen
的详细信息。例如
(lldb) script lldb.process.LoadImage(lldb.SBFileSpec("debugHelper.dylib", False), lldb.SBError())