小麦克 发表于 2024-8-16 23:22

【米尔 NXP i.MX93 开发板评测】GDB调试

# GDB调试

在调试应用程序时出了问题,需要在线调试,下面看看在设备端进行GDB调试的方法。

配置`buildroot`,生成目标设备`gdb`工具,打包生成文件系统下载到设备中。

```bash
Target packages
        Debugging, profiling and benchmark
```



重新编译要调试的app,添加编译参数`-g`增加调试信息。下面以`buildroot`中的`libpjsip`为例进行说明。

`buildroot`默认情况下不带调试信息,找到`libpjsip`这个包的配置文件`libpjsip.mk`增加一行`LIBPJSIP_CFLAGS += -g`



重新编译`libpjsip`

```bash
make libpjsip-dirclean
make libpjsip-rebuild
```

将需要调试的应用程序下载到开发板,使用GDB进行调试。

```bash
gdb samples/aarch64-buildroot-linux-gnu/simpleua
(gdb) set args sip:bruce@192.168.1.228
(gdb) set print pretty on
(gdb) set listsize 20
(gdb) b main
(gdb) r
Starting program: /root/pjsip-apps/bin/samples/aarch64-buildroot-linux-gnu/simpleua sip:bruce@192.168.1.228
warning: Unable to find libthread_db matching inferior's thread library, thread debugging will not be available.

Breakpoint 1, main (argc=2, argv=0xffffc2490e08)
    at ../src/samples/simpleua.c:225
225   {
(gdb) n
```

以上步骤操作说明:

1. 使用GDB加载应用程序,`gdb samples/aarch64-buildroot-linux-gnu/simpleua`
2. 设置几个参数:`args` 给应用的参数,`print pretty on` 格式化结构体(更方便查看变量),`set listsize 20` 设置一次显示的行数(默认10行)
3. 设置断点 `b main`
4. 运行:r
5. 发现程序在mian函数第一行停住,等待进一步操作指令。



运行过程中需要打印复杂结构体,比如这里的`local_sdp`指针变量

```
(gdb) p *local_sdp.media
```

所有变量都会显示出来



还可以继续深挖下去,通过这种方法能查看所有变量的值。

```bash
(gdb) p *local_sdp.media.attr
$9 = (pjmedia_sdp_attr *) 0xaaaac01b10c8
(gdb) p **local_sdp.media.attr
$10 = {
name = {
    ptr = 0xffff949899f8 "rtcp",
    slen = 4
},
value = {
    ptr = 0xaaaac01b10e8 "4001 IN IP4 192.168.1.189",
    slen = 25
}
}
(gdb)
```

经过上面的调试,终于找到应用程序API调用失败是因为缺少编码器。将`package/libpjsip/libpjsip.mk`中屏蔽的编码器都打开。再次测试`simpleua`程序呼叫成功。

Jacktang 发表于 2024-8-17 07:28

<p>谢谢,分享在设备端进行GDB在线调试的方法</p>
页: [1]
查看完整版本: 【米尔 NXP i.MX93 开发板评测】GDB调试