GDB调试
在调试应用程序时出了问题,需要在线调试,下面看看在设备端进行GDB调试的方法。
配置buildroot
,生成目标设备gdb
工具,打包生成文件系统下载到设备中。
Target packages
Debugging, profiling and benchmark
重新编译要调试的app,添加编译参数-g
增加调试信息。下面以buildroot
中的libpjsip
为例进行说明。
buildroot
默认情况下不带调试信息,找到libpjsip
这个包的配置文件libpjsip.mk
增加一行LIBPJSIP_CFLAGS += -g
重新编译libpjsip
make libpjsip-dirclean
make libpjsip-rebuild
将需要调试的应用程序下载到开发板,使用GDB进行调试。
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
以上步骤操作说明:
- 使用GDB加载应用程序,
gdb samples/aarch64-buildroot-linux-gnu/simpleua
- 设置几个参数:
args
给应用的参数,print pretty on
格式化结构体(更方便查看变量),set listsize 20
设置一次显示的行数(默认10行)
- 设置断点
b main
- 运行:r
- 发现程序在mian函数第一行停住,等待进一步操作指令。
运行过程中需要打印复杂结构体,比如这里的local_sdp
指针变量
(gdb) p *local_sdp.media[0]
所有变量都会显示出来
还可以继续深挖下去,通过这种方法能查看所有变量的值。
(gdb) p *local_sdp.media[0].attr
$9 = (pjmedia_sdp_attr *) 0xaaaac01b10c8
(gdb) p **local_sdp.media[0].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
程序呼叫成功。