debugging-native-code-ios.md 4.1 KB


title: 在 iOS/macOS 中调试

brief: 本教程介绍了如何使用 Xcode 进行调试.

在 iOS/macOS 中调试

这里我们介绍如何使用 Xcode, Apple的 macOS 和 iOS 首选开发环境来调试应用.

Xcode

  • 使用 bob, 加上 --with-symbols 选项打包应用 (更多详情):

    $ cd myproject
    $ wget http://d.defold.com/archive/<sha1>/bob/bob.jar
    $ java -jar bob.jar --platform armv7-darwin build --with-symbols --variant debug --archive bundle -bo build/ios -mp <app>.mobileprovision --identity "iPhone Developer: Your Name (ID)"
    
  • 安装应用, 可以通过 Xcode, iTunes 或者 ios-deploy

    $ ios-deploy -b <AppName>.ipa
    
  • 得到 .dSYM 文件夹 (即调试 symbols)

    • 如果没使用原生扩展, 可以从 d.defold.com 下载 .dSYM 文件

    • 如果使用了原生扩展, 可以使用 bob.jar 生成 .dSYM 文件夹. 只需要 building (不需要 archive 和 bundling):

      $ cd myproject
      $ unzip .internal/cache/arm64-ios/build.zip
      $ mv dmengine.dSYM <AppName>.dSYM
      $ mv <AppName>.dSYM/Contents/Resources/DWARF/dmengine <AppName>.dSYM/Contents/Resources/DWARF/<AppName>
      

创建项目

要正确的调试, 我们需要一个项目, 以及一个代码映射(source map). 这次项目不是用来编译的, 只是调试举例.

*新建 Xcode 项目, 选择 Game 模板

![project_template](images/extensions/debugging/ios/project_template.png)
  • 指定一个名字 (例如 debug) 并且使用默认设置

  • 选择一个存放项目的目录

  • 为应用加入代码文件

    add_files

  • 确保 "Copy items if needed" 未选中.

    add_source

  • 结果是这样

    added_source

  • 关闭 Build 步骤

    edit_scheme

    disable_build

  • 设置 Deployment target 版本

    deployment_version

  • 设置目标设备

    select_device

启动调试器

调试应用有如下方法

  1. 可以使用 Debug -> Attach to process... 然后选择要调试应用

  2. 也可以选择 Attach to process by PID or Process name

    select_device

  3. 从设备上启动应用

  4. Edit Scheme 中加入 .app 作为可运行文件夹

  5. 调试 symbols

    要使用 lldb, 运行必须先暂停

    • .dSYM 目录加入到 lldb 中

      (lldb) add-dsym <PathTo.dSYM>
      

      add_dsym

    • 确认 lldb 成功读取 symbols

      (lldb) image list <AppName>
      

    路径映射

    • 加入引擎路径 (根据你的安装目录自行调整)

      (lldb) settings set target.source-map /Users/builder/ci/builds/engine-ios-64-master/build /Users/mathiaswesterdahl/work/defold
      (lldb) settings append target.source-map /private/var/folders/m5/bcw7ykhd6vq9lwjzq1mkp8j00000gn/T/job4836347589046353012/upload/videoplayer/src /Users/mathiaswesterdahl/work/projects/extension-videoplayer-native/videoplayer/src
      
      • 从可运行文件夹里可以得到 job 文件夹. job 文件夹命名类似这样 job1298751322870374150, 每次都是随机数字.

        $ dsymutil -dump-debug-map <executable> 2>&1 >/dev/null | grep /job
        
    • 验证路径映射

      (lldb) settings show target.source-map
      

    可以使用如下命令确定 symbol 的源代码文件

    (lldb) image lookup -va <SymbolName>
    

    断点

    • 从 project 视图打开一个文件, 然后设置断点

      breakpoint

    注意

    检查二进制文件 UUID

    为了让调试器接受 .dSYM 文件夹, UUID 需要与可运行文件的 UUID 相匹配. 你可以这样检查 UUID:

    $ dwarfdump -u <PathToBinary>