结果是,尝试单步进入 d(11) 调用会跨过它(返回预期的 22)。
我尝试过各种我发现的技巧。最有希望的是成功后的add-dsym
dlopen
,但是:
(lldb) add-dsym lib.dylib.dSYM
error: symbol file '/Users/myusername/Documents/dy-try/lib.dylib.dSYM/Contents/Resources/DWARF/lib.dylib' does not match any existing module
(使用 clang 13.0.0,lldb-1300.0.42.3)
// lib.h
#define exporting __attribute__((visibility("default")))
exporting int doubles(int a);
typedef int doubles_f(int a);
// lib.c
#include "lib.h"
exporting int doubles(int a) {
return a*2;
}
// exe.c
#include <dlfcn.h>
#include "lib.h"
int main(void) {
void* Lib = dlopen("./lib.dylib", RTLD_LAZY);
// does not help to change the path to absolute or lazy to now
doubles_f* d = dlsym(Lib, "doubles");
int res = d(11);
return 0;
}
// Makefile
all: lib.dylib exe
lib.dylib: lib.c
clang -o $@ $< -shared -g -Wall
exe: exe.c
clang -o $@ $< -g -Wall
当链接器构建二进制文件时,它会将 UUID 写入二进制文件,您可以使用命令
dwarfdump --uuid <binary>
image list
输出中看到 UUID。
然后,当 dsymutil 从您的二进制文件创建 dSYM 时,它会将 UUID 复制到那里。同样,您可以通过dwarfdump --uuid
看到这一点。仅当 dSYM 的 UUID 与二进制文件之一匹配时,add-dsym 才会成功。否则,调试会话可能会非常混乱。
因此请确保这两个 UUID 匹配。如果他们这样做了,但 add-dsym 仍然不起作用,请向 Apple 的错误跟踪器提交问题。但如果它们不匹配,则在创建 dSYM 后会重建二进制文件,导致两个 UUID 不匹配。