第一个fuchsia上c++程序

第一个fuchsia上c++程序

第一个fuchsia上c++程序


在linux主机上 借助于qemu把fuchsia系统跑起来了,接下来就 搞个小程序在上面跑一跑吧

在fuchsia的源码树里已经有一些示例代码了,位于fuchsia/examples/下

最简单的当然是hello_world的, 里面有个 c++版本和rust版本的hello world

还真的只是hello_world

我仿照这个hello_world,写个自己的小程序试试

编写代码

  • 在examples目录下 建立一个文件夹,命名为first
  • 创建一个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

参考

9to5google.com/2018/12/

fuchsia.dev/fuchsia-src

在源码树里进行编译

首先需要将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://fuchsia.com/first_cpp#
  • 开始打断点和单步调试, 这个和gdb基本一样了

完成过程如图

参考文档来自官方的fuchsia dev fuchsia debug

打印log

在fuchsia系统里,打印log的几种模式

  • the LogSink service,用户层的log打印
  • the kernel's debuglog, 内核的log打印
  • a combination of these, routed through stdout or stderr, 直接在终端输出

显然,我需要使用的是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简单,性能目前还不好说。
编辑于 2020-05-18 00:13