SDX12 上层应用gdb调试及环境搭建
- 1. 问题背景
- 2 环境搭建
- 3 操作步骤
- 4. 调试过程
- 5 实现效果
- 6 附录
1. 问题背景
上层应用在问题定位的过程中,现有手段只能有有限的log打印,通常情况下很难定位问题。如果想在应用程序执行的过程中查看任意调用关系或者数据就必须重新编译代码,这样调试费时费力。使用gdb调试可以高效的对应用进行分析,并且能实时的改变应用程序的执行路径,强大的调试功能能够让我们更好的去分析问题。
2 环境搭建
- 使用高通的交叉编译工具链编译、生成GDB工具将GDB工具导入到高通平台模块中
- 执行客户的应用程序,并生成core dump文件
- 将源代码push到手机中
- 使用GDB工具进行调试
注意:当前X12项目没有添加gdb,为了调试方便gdb的编译我们将在x55项目中进行生成。添加gdb请参考x55配置或者根据以下链接Preparing Yocto Development Environment for Debugging适配。
3 操作步骤
- 生成模块端可用的GDB工具
- 进入如下目录
sdx12-le-1-0/apps_proc/poky - 执行以下命令:
source build/conf/set_bb_env.sh
bitbake –c cleanall gdb
bitbake gdb
- 生成后的路径如下,执行bitbake -e gdb | grep ^S=
- 执行readelf -a gdb | grep NEEDED查看文件所需要的动态库:
- 准备必要的动态链接库
需要的lib库在bitbake -e gdb | grep ^S=编译目录里面查找,经过测试,只需要准备以下两个动态库就可以了,其他的x12已经在文件系统中存在:
4. 调试过程
- 配置$YOCTO_BUILD/conf/local.conf,生成带调试符号的可执行文件
以上配置用于添加gdb或者调试功能在镜像编译中:
# Specifies to build packages with debugging information
DEBUG_BUILD = "1"
# Do not remove debug symbols
INHIBIT_PACKAGE_STRIP = "1"
# OPTIONAL: Do not split debug symbols in a separate file
INHIBIT_PACKAGE_DEBUG_SPLIT= "1"
BBDEBUG = "yes"
INHERIT += "buildhistory"BUILDHISTORY_COMMIT = "1"
注意:添加调试符号的配置请不要用于生成gdb,否则gdb也会包含调试符号,会使gdb有70M左右,x12分区可用一般60M
-
编译生成带调试符号的可执行文件
bitbake -c compile $PACKAGE_NAME 编译需要debug的文件,从编译目录生成的Makefile可以看到编译参数已经变化,如下图:
-
如果需要debug系统生成异常app对应的core dump文件,请按照以下步骤
- adb shell 进入模块侧执行如下
- 生成core dump文件
- 拷贝GDB所需要的库文件
通过adb shell 进入模块,查看lib目录下是否包含所有上面GDB所需要的所有库文件,没有的需要拷贝到模块中
注意:拷贝时,要拷贝在编译GDB时生成的最终的库文件,而不是软链接;拷贝后,文件名要与GDB所需库文件名一致 - 将需要debug的源代码push到模块中
如下图,带调试符号的二进制文件加载后就会显示reading symbols done,然后dir $source_path添加源码位置,再执行gdb即可
5 实现效果
6 附录
已经交叉编译好的gdb