第一个fuchsia上c++程序
在linux主机上 借助于qemu把fuchsia系统跑起来了,接下来就 搞个小程序在上面跑一跑吧
在fuchsia的源码树里已经有一些示例代码了,位于fuchsia/examples/下
最简单的当然是hello_world的, 里面有个 c++版本和rust版本的hello world
还真的只是hello_world
我仿照这个hello_world,写个自己的小程序试试
编写代码
- 在examples目录下 建立一个文件夹,命名为first
- 创建一个http://first.cc文件,把简单的代码写了
- 创建对应的编译gn文件, gn文件是生成ninja的配置, ninja是一套构建工具,而gn是元构建工具,生成ninja
- 编写项目配置文件first_cpp.cmx,放到meta目录下, 官方说法是Component manifest, 作用类似android应用里的AndroidManifest.xml文件
编译应用程序
有两种方法编译应用程序,一是用fuchsia的sdk, 二是直接在源码树里编译应用
sdk的获取
可以直接下载一份sdk,但是要考虑到这个系统还在开发中,我们本地的fuchsia源码和下载的sdk不一定是完全匹配的。这时可以选择自己编译一份sdk, 用这个
fx set core.x64 --args=build_sdk_archives=true
fx build
参考
https://9to5google.com/2018/12/14/fuchsia-friday-sdk-download/
https://fuchsia.dev/fuchsia-src/development/sdk/download
在源码树里进行编译
首先需要将first包含进build,命令如下:
- 在源码树下准备编译, 把工程加入到编译选项里,报错了
这个错误说明不能随意加一个包方法源码树里,它会检查这个包是否是在visibility list里。那如果我一定要的话,需要把first加入到visibility list里, 修改 build/BUILD.gn文件,格式是 路径+包
继续,这下成功了
- 编译
运行
启动一个fx serve, 这个东西怎么理解呢, 它类似于 android开发的adb , PC机和android连接靠的是adb工具,adb会在PC机上运行一个server进程和android系统通信。 同理,和fuchsia系统通信就要用这个fx serve。
启动一个shell,执行如下命令:
fx serve
这时候 阻塞在 discovery这里, 表示在等待fuchsia设备
启动fuchsia, 在开一个shell窗口,执行如下命令
fx qemu -N
这里的 -N表示启动网络, 必须要有的,不然无法fuchsia系统不会和 serve连接。
系统启动完毕后,就会发现 serve那个窗口是这样的,表示serve和qemui的fuchsia建立连接了。
这时, 再开一个shell,窗口执行fx shell, 这个就类似android里的adb shell, 能够进入到fuchsia的shell
用locate命令查找下 first在哪里
用run命令执行
断点调试
fuchsia上有个叫zxdb的工具,用于调试c/c++程序。 参考 zxdb: Fuchsia native debugger
- 另起一个shell,执行fx debug, 这个是启动了zxdb(类似gdb一样的调试器)
fx debug - 把目标进程first添加到调试器的列表里, 这样当first启动时自动就attach上了。
attach first - 给main函数上断点
b main - 执行first
fx shell run fuchsia-pkg://http://fuchsia.com/first_cpp#meta/first_cpp.cmx - 开始打断点和单步调试, 这个和gdb基本一样了
完成过程如图
参考文档来自官方的fuchsia dev fuchsia debug
打印log
在fuchsia系统里,打印log的几种模式
- the LogSink service,用户层的log打印
- the kernel's debuglog, 内核的log打印
- a combination of these, routed through
stdout
orstderr
, 直接在终端输出
显然,我需要使用的是logsink service, 参考官方文档 Syslog
第一步, 要在Component manifest里加上依赖log service。
第二步, 在first的编译配置文件BUILD.gn,加上编译链接依赖(第16行)
第三步,写代码吧, 注意要加的头文件
第四步, 分别是fx build编译和 fx shell run运行
运行结束了, 去哪里看log呢? 查下官网, 用fx log, 默认情况下log tag是manifext文件的名,这里就是first_cpp.cmx了
小结
这个新fuchsia系统很多操作其实和linux,android有类似的地方,使用起来也还算顺手。
比如
- debug工具和gdb类似;
- fx log和android的adb logcat类似;
- 包配置文件cmx和android 的AndroidManifext.xml类似;
- 编译链工具用gn,更简单性能更好。这个编写比android.mk简单,性能目前还不好说。