上篇介绍了定制rpi os,在上篇的基础上这里介绍怎么通过yocto进行应用开发,并在RPI OS上进行gdb调试。
Gdb调试组织架构
环境:
- ubuntu 22.04
- raspiberry 4B
- U盘 64G
- yocto 4.1.2
- vmware 16.2.4
- gdb 12.1
Rpi OS增加gdb特性
Rpi OS如果需要gdb进行远程调试,需要在镜像core-image-base-rpi.bb中添加"tools-debug" feature,添加以后就可以在Rpi开发板上开启gdbserver:
core-image-base-rpi.bb
创建myhello应用
- 新建meta-hello layer,并且把该layer添加到bblayers.conf:
cd xxx/poky
source oe-init-build-env rpi-build
bitbake-layers create-layer ../meta-hello
bitbake-layers add-layer ../meta-hello
目录结构如下:
yocto/poky$ tree -L 2 -n
.
├── meta-hello
│ ├── conf
│ ├── COPYING.MIT
│ ├── README
│ └── recipes-example
├── meta-mylayer
...
├── meta-raspberrypi
...
├── oe-init-build-env
├── rpi-build
│ ├── bitbake-cookerdaemon.log
│ ├── cache
│ ├── conf
│ ├── downloads
│ ├── sstate-cache
│ └── tmp
2.在meta-hello/recipes-example目录下新建myhello文件夹,然后在myhello目录下创建files文件夹作为recipe的SRC_URI的路径。在files目录下创建myhello.c源文件:
#include <stdio.h>
int main (void)
{
int i;
printf ("Enter Programme\n");
for(i=0;i<=10;i++) {
printf ("count:%d\n",i);
}
printf ("exit\n");
return 0;
}
- 创建myhello recipe文件,内容如下,do_compile中需要加-g,表示带有调试信息:
DESCRIPTION = "Simple helloworld application"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "file://myhello.c"
S = "${WORKDIR}"
do_compile() {
${CC} myhello.c ${LDFLAGS} -o myhello -g
}
do_install() {
install -d ${D}${bindir}
install -m 0755 myhello ${D}${bindir}
}
- 编译myhello,确认语法是否有误:
bitbake myhello
myhello应用的目录如下:
yocto/poky/meta-hello$ tree -L 4 -n
.
├── conf
│ └── layer.conf
├── COPYING.MIT
├── README
└── recipes-example
├── example
│ └── example_0.1.bb
└── myhello
├── files
│ └── myhello.c
└── myhello.bb
镜像编译
把myhello应用编译到镜像中,需要在local.conf中进行install:
IMAGE_INSTALL
注:如果不安装到镜像中,在gdb调试的时候也可以通过命令把myhello push到开发板:remote put myhello myhello,为了方便调试直接安装到了镜像中。
编译镜像:
bitbake core-image-base-rpi -c cleansstate
bitbake core-image-base-rpi
RPI OS查看是否包含myhello:
rpios确认存在myhello
RPI OS查看是否有gdbserver功能:
rpios是否包含gdbserver
远程调试
- 安装gdb-multiarch,支持多种硬件体系架构的gdb版本,调试前需要设置体系参数。
sudo apt-get install gdb-multiarch
- rpi开发板启动gdbserver,在开发板上执行:
gdbserver --multi :5555 myhello
- 确认myhello路径:
yocto/poky/rpi-build/tmp/work$ find ./ -name myhello -type f
使用myhello包路径下的二进制,该路径下包含myhello.c源码:
4.gdb-multiarch调试myhello:
$gdb-multiarch -q xxx/myhello
Reading symbols from xxx/myhello...
- 设置体系参数:
(gdb) set architecture arm
The target architecture is set to "arm".
6.连接远程开发板:
(gdb) target extended-remote 开发板IP:5555
Remote debugging using xxx.xxx.xxx.xxx:5555
7.设置断点,进行run:
(gdb) b main
Breakpoint 1 at 0x438: file /usr/include/bits/stdio2.h, line 86.
(gdb) run
Starting program:xxx/myhello
如下图: