# 编译构建调试指导 ## Vs Code插件配置 建议初学者配置Vs Code并安装插件实现高效Openharmony项目的高效开发。以下列出了常用的插件列表以及功能,开发者可以按需进行配置和使用。 | 插件 | 作用 | | ------------------ | ----------------------------------------------------- | | Remote-SSH | 连接远程服务器 | | GN | GN语法高亮 | | GN format | GN格式化工具,实现右键格式化GN文件 | | GN Language Server | GN关键字说明、提示、补全、跳转 | | python | Python语法高亮,debug | | Pylance | Python代码补全,API说明 | | gitlens | 增强Git功能,可视化本地分支、远程分支以及历史提交信息 | | clangd | LLVM官方插件,实现代码跳转,自动补全,语义检查等功能 | 插件Remote-SSH示例: ![remote_ssh](./figures/remote_ssh.png) ### Preloader、Loader阶段调试 #### 1.背景介绍 建议开发者在阅读本教程前先查看[编译构建指导文档](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/subsys-build-all.md),对整个Openharmony的产品、子系统、部件、模块以及构建系统GN和Ninja等概念有基本了解。接下来介绍整个Openahrmony的编译流程和各阶段的调试定位方法。 Openharmony完整的编译构建流程主要可以分成以下四个阶段:Preloader、Loader、GN以及Ninja过程。 ![preloader_loader](./figures/preloader_loader_gn_ninja.png) ​ Preloader和Loader阶段主要是执行python脚本preloader.py和loader.py,Preloader阶段根据vendor仓的产品配置config.json文件对产品配置进行解析,并将解析结果输出到out/preloader/{product_name}目录下,loader阶段进行部件化配置的加载,并将解析结果输出到out/{product_name}/build_configs文件夹下。以下主要介绍preloader和loader阶段的调试过程,帮助开发者更好的调试Openharmony代码,定位preloader和loader阶段的错误,提升开发效率。 ![preloader_out](./figures/preloader_out.png) #### 2. preloader阶段调试 - 配置launch.json 点击Vs Code左侧”运行与调试按钮“,配置launch.json内容 ![launch_json](./figures/launch_json.png) ``` { // 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。 // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "hb_debug", "type": "python", "request": "launch", "program": "/mnt/xiaoxiaoliang/code/ohos/build.py", "console": "integratedTerminal", "args": [ "-p" , "rk3568" ], "cwd": "/mnt/xiaoxiaoliang/code/ohos", "justMyCode": false } ] } ``` 各字段含义: | 字段 | 含义 | | ---------- | ------------------------------------------------------------ | | name | 调试器名称,随便取一个就可以 | | type | 必填项,调试类型,选择相应语言类型 | | request | 必填项,有两种类型,分别是 `launch` 和 `attach`,这里选launch即可 | | program | 需要调试的脚本路径 | | console | integratedTerminal、internalConsole、externalTerminal,这里选择integratedTerminal即可 | | args | 传递给脚本的参数 | | cwd | 脚本所在路径 | | justMyCode | true或false,设置为true,只调试用户自己编写的代码,false则会调试标准库的代码 | - 开始调试,设置断点,然后点击hb_debug按钮进行调试 ![vscode_debug](./figures/vs_code_debug.png) | 字段 | 含义 | | -------- | -------------------------------- | | 变量 | 查看变量的值,监控变量的变化情况 | | 监视 | 选择自己想要监控的变量 | | 调用堆栈 | 查看函数的调用堆栈 | | 断点 | 查看所有设置的断点信息 | - 单步调试等 ![单步调试](./figures/step_in.png) - 调试preloader、loader过程 建议开发者基于以上方法对preloader和loader进行调试,从而查看产物与函数之间的一一对应关系,当编译出错时,分清楚出错阶段,进行对阶段的产物进行横向对比分析,找到问题根源 ## GN调试 以下列表列出了常见的GN调试命令供开发者查阅和使用,主要介绍了命令以及它的详细使用方法。 | 命令 | 作用 | 详细命令 | | -------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | | gn gen | 产生ninja文件 | gn gen [--check] [] | | gn ls | 列出目录下所有的target | gn ls [] [--default-toolchain] [--as=...] | | gn args | 列出所有的gn参数 | gn args [--list] [--short] [--args] [--overrides-only] | | gn desc | 列出target/config的所有信息 | gn desc