macOS 上的 lldb 不使用 dSYM

问题描述 投票:0回答:1

结果是,尝试单步进入 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>
macos clang lldb
1个回答
0
投票
image list

输出中看到 UUID。

然后,当 dsymutil 从您的二进制文件创建 dSYM 时,它会将 UUID 复制到那里。同样,您可以通过 
dwarfdump --uuid
看到这一点。仅当 dSYM 的 UUID 与二进制文件之一匹配时,add-dsym 才会成功。否则,调试会话可能会非常混乱。

因此请确保这两个 UUID 匹配。如果他们这样做了,但 add-dsym 仍然不起作用,请向 Apple 的错误跟踪器提交问题。但如果它们不匹配,则在创建 dSYM 后会重建二进制文件,导致两个 UUID 不匹配。

    

© www.soinside.com 2019 - 2024. All rights reserved.