天天看点

树莓派4B中级10-yocto应用开发以及gdb远程调试

上篇介绍了定制rpi os,在上篇的基础上这里介绍怎么通过yocto进行应用开发,并在RPI OS上进行gdb调试。

树莓派4B中级10-yocto应用开发以及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:

树莓派4B中级10-yocto应用开发以及gdb远程调试

core-image-base-rpi.bb

创建myhello应用

  1. 新建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;
}           
  1. 创建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}
}           
  1. 编译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:

树莓派4B中级10-yocto应用开发以及gdb远程调试

IMAGE_INSTALL

注:如果不安装到镜像中,在gdb调试的时候也可以通过命令把myhello push到开发板:remote put myhello myhello,为了方便调试直接安装到了镜像中。

编译镜像:

bitbake core-image-base-rpi -c cleansstate
bitbake core-image-base-rpi           

RPI OS查看是否包含myhello:

树莓派4B中级10-yocto应用开发以及gdb远程调试

rpios确认存在myhello

RPI OS查看是否有gdbserver功能:

树莓派4B中级10-yocto应用开发以及gdb远程调试

rpios是否包含gdbserver

远程调试

  1. 安装gdb-multiarch,支持多种硬件体系架构的gdb版本,调试前需要设置体系参数。
sudo apt-get install gdb-multiarch           
  1. rpi开发板启动gdbserver,在开发板上执行:
gdbserver --multi :5555 myhello           
树莓派4B中级10-yocto应用开发以及gdb远程调试
  1. 确认myhello路径:
yocto/poky/rpi-build/tmp/work$ find ./ -name myhello -type f           

使用myhello包路径下的二进制,该路径下包含myhello.c源码:

树莓派4B中级10-yocto应用开发以及gdb远程调试

4.gdb-multiarch调试myhello:

$gdb-multiarch -q xxx/myhello
Reading symbols from xxx/myhello...           
  1. 设置体系参数:
(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            

如下图:

树莓派4B中级10-yocto应用开发以及gdb远程调试

继续阅读