【问题标题】:Where Debug info stored in Framework?Debug 信息存储在 Framework 中的什么位置?
【发布时间】:2021-04-01 00:45:35
【问题描述】:

正如标题所述,我对存储在.Framework 文件中的调试信息的位置感到困惑。

我用谷歌搜索了几天,我得到的是:

通过调试模式编译的框架二进制文件将包含一个调试信息段,以指示符号位置。发布模式编译会将其移动到 dSYM 文件中。

但是,让我困惑的是,我用忍者构建了一个框架,它不会生成dSYM 文件。同时我无法通过dwarfdump 命令或MachOView 应用程序找到符号位置。至于strings 命令可以得到一些相对文件路径的结果,比如../../flutter/fml/memory/task_runner_checker.cc

这里 dwarfdump 打印:

Flutter.framework/Flutter:      file format Mach-O arm64

.debug_info contents:

这是我的问题:

  1. 当我在框架的某处触发断点时,源代码仍然显示。为什么?

  2. 当我运行 lldb 命令时,它显示:

(lldb) image lookup -a $pc --verbose
      Address: Flutter[0x0000000001964f18] (Flutter.__TEXT.__text + 26604184)
      Summary: Flutter`dart::BootstrapNatives::DN_LoadLibraryFromTypedData(dart::Thread*, dart::Zone*, dart::NativeArguments*) + 44 [inlined] dart::NativeArguments::NativeArgAt(int) const at object.cc:537
               Flutter`dart::BootstrapNatives::DN_LoadLibraryFromTypedData(dart::Thread*, dart::Zone*, dart::NativeArguments*) + 44 [inlined] dart::DN_HelperLoadLibraryFromTypedData(dart::Isolate*, dart::Thread*, dart::Zone*, dart::NativeArguments*) at object.cc:534
               Flutter`dart::BootstrapNatives::DN_LoadLibraryFromTypedData(dart::Thread*, dart::Zone*, dart::NativeArguments*) + 44 at object.cc:534
       Module: file = "/Users/xx/Library/Developer/Xcode/DerivedData/XXX-ddigzjlnuypwnydlawevfrkmdsov/Build/Products/Debug-iphoneos/XXX.app/Frameworks/Flutter.framework/Flutter", arch = "arm64"
  CompileUnit: id = {0x00000000}, file = "/Users/xx/Documents/workspace/aion/flutter_engine/src/third_party/dart/runtime/lib/object.cc", language = "c++14"
     Function: id = {0x7d40006244d}, name = "dart::BootstrapNatives::DN_LoadLibraryFromTypedData(dart::Thread*, dart::Zone*, dart::NativeArguments*)", mangled = "_ZN4dart16BootstrapNatives27DN_LoadLibraryFromTypedDataEPNS_6ThreadEPNS_4ZoneEPNS_15NativeArgumentsE", range = [0x0000000117310eec-0x0000000117311490)
     FuncType: id = {0x7d40006244d}, byte-size = 0, decl = bootstrap_natives.h:507, compiler_type = "class dart::ObjectPtr (class dart::Thread *, class dart::Zone *, class dart::NativeArguments *)"
       Blocks: id = {0x7d40006244d}, range = [0x117310eec-0x117311490)
               id = {0x7d40006249b}, ranges = [0x117310f18-0x1173113e0)[0x117311404-0x117311490), name = "DN_HelperLoadLibraryFromTypedData", decl = object.cc:534, mangled = _ZN4dartL33DN_HelperLoadLibraryFromTypedDataEPNS_7IsolateEPNS_6ThreadEPNS_4ZoneEPNS_15NativeArgumentsE, demangled = dart::DN_HelperLoadLibraryFromTypedData(dart::Isolate*, dart::Thread*, dart::Zone*, dart::NativeArguments*)
               id = {0x7d40006253a}, range = [0x117310f18-0x117310f24), name = "NativeArgAt", decl = native_arguments.h:129, mangled = _ZNK4dart15NativeArguments11NativeArgAtEi, demangled = dart::NativeArguments::NativeArgAt(int) const
    LineEntry: [0x0000000117310f18-0x0000000117310f24): /Users/xx/Documents/workspace/xxx/flutter_engine/src/third_party/dart/runtime/vm/native_arguments.h:132:14
       Symbol: id = {0x0013fd0f}, range = [0x0000000117310eec-0x0000000117311490), name="dart::BootstrapNatives::DN_LoadLibraryFromTypedData(dart::Thread*, dart::Zone*, dart::NativeArguments*)", mangled="_ZN4dart16BootstrapNatives27DN_LoadLibraryFromTypedDataEPNS_6ThreadEPNS_4ZoneEPNS_15NativeArgumentsE"
     Variable: id = {0x7d400062553}, name = "this", type = "const dart::NativeArguments *", location = DW_OP_reg20 W20, decl = 
     Variable: id = {0x7d40006255c}, name = "index", type = "int", location = <decoding error> 00 00 00, decl = native_arguments.h:129
     Variable: id = {0x7d4000624a8}, name = "isolate", type = "dart::Isolate *", location = , decl = object.cc:534
     Variable: id = {0x7d4000624ad}, name = "thread", type = "dart::Thread *", location = , decl = object.cc:534
     Variable: id = {0x7d4000624b2}, name = "zone", type = "dart::Zone *", location = DW_OP_reg19 W19, decl = object.cc:534
     Variable: id = {0x7d4000624bb}, name = "arguments", type = "dart::NativeArguments *", location = DW_OP_reg20 W20, decl = object.cc:534
     Variable: id = {0x7d4000624c4}, name = "program", type = "unique_ptr<dart::xx_kernel::Program, std::__1::default_delete<dart::xx_kernel::Program> >", location = DW_OP_breg31 WSP+64, decl = object.cc:556
     Variable: id = {0x7d400062468}, name = "thread", type = "dart::Thread *", location = DW_OP_reg24 W24, decl = object.cc:534
     Variable: id = {0x7d400062479}, name = "zone", type = "dart::Zone *", location = DW_OP_reg19 W19, decl = object.cc:534
     Variable: id = {0x7d40006248a}, name = "arguments", type = "dart::NativeArguments *", location = DW_OP_reg20 W20, decl = object.cc:534

那么,lldb 从哪里获得Compile UnitLineEntry 输出?

【问题讨论】:

    标签: xcode frameworks lldb


    【解决方案1】:

    Darwin 系统的调试信息存在于以下两个位置之一:在.o 文件中,然后在运行dsymutil 以创建.dSYM 后,它存在于.dSYM 捆绑包中,全部收集在一起,重新定位到实际的二进制地址。

    这是一个构建-链接-调试性能增强。链接所有调试信息——更新所有符号地址,复制它——非常慢,因此将调试信息保留在.o 文件中以用于这个常见的迭代开发周期,并让调试器找到@987654326 @文件并在内部更新函数的地址,允许快速开发。

    当然,将所有调试信息保留在.o 文件中要求它们都存在!并在相同的文件路径。因此,当您需要在计算机之间移动二进制文件或将其保存以供以后调试时,这并不好。对于这些情况,您将调试信息与dsymutil 链接,您将获得一个.dSYM 包。

    【讨论】:

    • 非常感谢您的帮助。现在我可以理解为什么dwarfdump BINARYFILE 不打印任何调试信息了。但是,另一个问题随之而来。有时我们没有 dSYM 文件,二进制文件如何找到调试信息所在的位置?就像我在问题中提到的那样, lldb 命令打印 Compile Unit 指示相关文件的位置。再次感谢。
    • @RyanYan 如果您使用nm -pa BINARYFILE,您将看到我们称之为“调试映射”的旧 stabs 列表条目 - 它们包括指向 .o 文件路径的指针(OSO 条目)除了源文件、函数和全局符号的开始/结束。 dsymutil 或 lldb 在未剥离的可执行文件中使用这些调试映射条目将 DWARF 从 .o 文件“重新定位”到它们正确的链接地址。
    • 非常感谢,非常感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    相关资源
    最近更新 更多