如何使用Xcode 5将预编译的静态库的调试符号与源代码进行匹配?

Chr*_*ger 6 xcode ffmpeg ios lldb xcode5

我必须使用外部构建脚本编译FFmpeg for iOS ,但是当我调试时,如果我深入研究libavformat库函数,我会看到汇编程序:

0x109a73:  cmpl   $0, 1192(%ebp)
0x109a7a:  jns    0x109a86                  ; mov_write_header + 198 at movenc.c:3539
0x109a7c:  movl   $1, 1192(%ebp)
0x109a86:  movl   16(%ebp), %eax
0x109a89:  cmpl   $0, 84(%eax)
0x109a8d:  movl   %edx, %ecx
0x109a8f:  jne    0x109ad9                  ; mov_write_header + 281 at movenc.c:3548
0x109a91:  testb  $2, 48(%ecx)
0x109a95:  jne    0x109ac1                  ; mov_write_header + 257 at movenc.c:3541
Run Code Online (Sandbox Code Playgroud)

有一些清晰的调试符号可以让我相信应该有一些方法告诉Xcode这个源代码的位置,以便于调试.

这甚至可能吗?

编辑:我在这里找到了一个相关的问题Xcode 4中没有外部库的符号/来源

因此,当我跑步时,xcrun dwarfdump libavformat.a | grep "\.c"我得到一堆这样的结果:

AT_decl_file( "libavformat/movenc.c" )
Run Code Online (Sandbox Code Playgroud)

所以我尝试将相关的源文件放在相对于.a文件和我的.xcodeproj文件的文件夹中,但这两种方法都不起作用.完整源代码可在此处获得:https://github.com/openwatch/livestreamer-ios

edit2:我发现了另一个关于如何为lldb设置源映射的问题但是我不太清楚要做什么... LLDB相当于用于指定源搜索路径的gdb"directory"命令?

好像我可能需要做

(lldb) settings set target.source-map libavformat/movenc.c /path/to/libavformat/movenc.c 
Run Code Online (Sandbox Code Playgroud)

我需要的每个文件?

Chr*_*ger 4

所以看来问题是我将 libavcodec.a、libavformat.a 等编译成我的 FFmpegWrapper 项目 (libFFmpegWrapper.a) 中的单个静态库,然后我将其作为静态库包含在名为 LiveStreamer 的包含项目中。将 .a 文件移动并将源文件(未添加到构建目标)添加到 LiveStreamer 项目修复了该问题。

如果将来有人遇到这个问题,请随时给我留言,因为我已经为此苦苦挣扎了好几天。

  • 我对有源代码但使用 cmake 单独编译的库也有同样的问题。您能更详细地解释一下这个过程或者举个例子吗?是否可以使用 Xcode 进行调试,或者是否需要 lldb 命令行?谢谢! (3认同)