#夏日挑战赛#OpenHarmony上移植gdb调试工具并使用gdb调试系统程 原创 精华

深开鸿
发布于 2022-6-17 17:44
浏览
4收藏

本文正在参加星光计划3.0–夏日挑战赛
作者:谢长钟

1. 交叉编译环境搭建

什么是交叉编译?
就是在一个平台上编译出在另外一个平台上运行的程序。此处所说的平台,包含了硬件平台和软件平台几部分,硬件平台一般指CPU架构,诸如ARM、MIPSEL等;软件平台指内核或操作系统。这里编译链接使用到的工具,我们统称为交叉工具链。

交叉编译一般应用于嵌入式领域,因为在目标嵌入式平台,资源有限,无法搭建一套编译环境来编译在自己平台上运行的程序,所以需要在其他资源更多、性能更强大的平台上使用交叉编译工具链来编译生成在目标嵌入式平台上运行的程序。

鸿蒙系统是最新的一个嵌入式系统平台,接下来教你在鸿蒙系统上如何搭建一套完整的gdb调试环境。

这里我们使用到的交叉工具链是arm-none-linux-gnueabi。

首先,下载交叉工具链:

http://www.360doc.com/content/16/0914/09/6828497_590676653.shtml

再使用root用户权限解压到Ubuntu主机或虚拟机上的/usr/local/路径下。

配置环境变量:
更改了你用户目录下的~/.bashrc文件:

vim ~/.bashrc

在文件最后添加一句:

export PATH=$PATH:/usr/local/arm-2014.05/arm-none-linux-gnueabi/bin

使其立马生效,执行一下命令:

source ~/.bashrc

这里~代表当前用户的目录,如果想让本Linux系统的所有用户的环境变量都带上交叉工具链的路径,需要更改/etc/profile文件,在profile文件最后加上export PATH=$PATH:/usr/local/arm-2014.05/arm-none-linux-gnueabi/bin,重启你的Linux系统即可生效。

2. 交叉编译gdb

gdb是Unix或linux下的程序调试工具,类似于win32下的visual studio。

运行在目标嵌入式平台上的gdb可以直接调试程序,通过 ‘gdb program’ 即可轻松debug你的程序。

但如果目标嵌入式平台没有操作终端,无法直接调试程序,也可以运行gdbserver,然后在宿主机端远程调试目标板上的程序。在目标板上通过 gdbserver 运行待调试的程序,在宿主机端运行 gdb 通过 ‘target remote [ip]:[port]’ 来远程连接到目标板上的 gdbserver,从而启动远程调试。在宿主机上输入各种调试命令,其目标板程序执行结果展示在目标板上,非常方便。

2.1 环境描述

虚拟机:

CPU:x86_64-linux-gnu

系统:Ubuntu 20.04

开发板:

CPU:rk3566

系统:OpenHarmony

虚拟机上安装的 C 交叉编译器为 arm-none-linux-gnueabi-gcc,即交叉编译工具链的前缀为 arm-none-linux-gnueabi。

2.2 下载源码

ftp://ftp.gnu.org/gnu/gdb 下载源码 gdb-10.1.tar.gz。

解压:

tar -zxvf ./gdb-10.1.tar.gz

2.3 交叉编译 gdb和gdbserver

编译 gdb:

cd gdb-10.1

./configure --prefix=/home/yourfolder/install --host=arm-none-linux-gnueabi 
--target=arm-none-linux-gnueabi CC=arm-none-linux-gnueabi-gcc AS=arm-none-linux-gnueabi-as 
AR=arm-none-linux-gnueabi-ar CXX=arm-none-linux-gnueabi-g++ CFLAGS="-O3" LDFLAGS="-static -O3"

注意这里LDFLAGS=“-static”,为了避免你的目标嵌入式系统使用的libc库与arm-none-linux-gnueabi交叉工具链使用的不一致,这里采用静态编译。同时增加了-O3的编译选项,优化gdb,使gdb可执行文件尽可能小一些。

–prefix指定你编译链接完成后,可执行文件所安装的目录。

configure完成后,会生成Makefile。

按顺序执行以下命令:

make

make install

最后在/home/yourfolder/install目录下找到可执行文件gdb和gdbserver,并将其推送到目标嵌入式开发板上。

3. 使用GDB在鸿蒙系统上调试程序

3.1 使用gdb调试普通应用程序

调试普通应用程序,使用gdb [program]即可,很简单。

./gdb test
GNU gdb (GDB) 10.1
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "arm-none-linux-gnueabi".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from /data/gdbtest...
(gdb) b main.cpp:14
Breakpoint 1 at 0x164c: file main.cpp, line 14.
(gdb) r
Starting program: /data/gdbtest 

3.2 使用gdb调试鸿蒙系统的服务程序

调试鸿蒙系统的系统服务程序,首先需要了解鸿蒙系统中是分布式调度主程序调度启停各个服务程序的,分布式调度主程序名为sa_main。

sa_main主程序通过配置/system/profile/camera_service.xml参数来启停camera_service。

接下来,演示一下,如何调试camera_service。

./gdb /system/bin/sa_main
GNU gdb (GDB) 10.1
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "arm-none-linux-gnueabi".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from /system/bin/sa_main...
(gdb)
(gdb) set args /system/profile/camera_service.xml
(gdb)
(gdb) r
Starting program: /system/bin/sa_main /system/profile/camera_service.xml
Thread 1 "camera_service" received signal SIGINT, Interrupt.
0xf7faf5a4 in ioctl () from /lib/ld-musl-arm.so.1
(gdb) bt
0  0xf7faf5a4 in ioctl () from /lib/ld-musl-arm.so.1
1  0xf7dc7318 in OHOS::BinderConnector::WriteBinder(unsigned long, void*) ()
  from /system/lib/libipc_core.z.so
2  0xf7dc86e4 in OHOS::BinderInvoker::TransactWithDriver(bool) ()
  from /system/lib/libipc_core.z.so
3  0xf7dc87a6 in OHOS::BinderInvoker::StartWorkLoop() ()
  from /system/lib/libipc_core.z.so
4  0xf7dc8edc in OHOS::BinderInvoker::JoinThread(bool) ()
  from /system/lib/libipc_core.z.so
5  0xf7f0b06e in OHOS::LocalAbilityManager::DoStartSAProcess(std::__h::basic_string<char,
std::__h::char_traits<char>, std::__h::allocator<char> > const&, int) () from
/system/lib/libsystem_ability_fwk.z.so
6  0x00403900 in main ()

可以看出gdb直接启动的是sa_main,然后再给sa_main设置上camera_service.xml参数。如此,便启动了camera_service程序,这样就可以对camera_service进行调试了。

3.3 使用gdb远程调试目标板上的程序

开发板:开发板 IP 是 192.168.202.141,则输入下述任一条指令皆可。

gdbserver :1234 test
gdbserver 127.0.0.1:1234 test
gdbserver 192.168.202.141:1234 test

宿主机:首先在 SHELL 命令行里运行 gdb 应用(注意此处的gdb是运行在宿主机平台上的gdb,不是交叉编译出来的gdb)。

./gdb

运行上一条命令后,SHELL 将进入 gdb 模式,下列几条指令中 ‘(gdb)’ 是提示符:

(gdb) target remote 192.168.202.141
(gdb) b main.c:55
(gdb) c

第一条命令是远程连接到开发板上的 gdbserver。连接之后,就是正常使用了。

第二条命令是设置断点。

第三条命令是运行程序,注意等待目标调试程序真正已经在开发板上成功运行了,所以此处要使用 ‘c’ 指令,而不能使用 ‘r’/‘run’ 指令,如果执行 ‘r’ 指令,可以看到提示 在remote 模式下不支持 ‘r’ 指令:

(gdb) r
The "remote" target does not support "run".  Try "help target" or "continue".

更多原创内容请关注:深开鸿技术团队

入门到精通、技巧到案例,系统化分享HarmonyOS开发技术,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2022-6-17 18:41:34修改
7
收藏 4
回复
举报
回复
    相关推荐