在OpenBMC调试中,有时会产生coredump却不知道从哪里入手分析,GDB工具就可以提供帮助。
1 编译带GDB工具的镜像
OpenBMC镜像中默认没有加入GDB工具,因此首先需要编译一个带GDB工具的OpenBMC镜像用于调试。在recipes-phosphor/packagegroups/packagegroup-obmc-apps.bbapend文件的DEBUG_TOOL中加入gdb选项:
编译镜像,如果在编译中产生squshfs-xz is too large!相关报错,可以选择一些暂不需要的模块,从文件中删除以减小占用空间。(此镜像只用于通过QEMU调试,不用在实体机器上)
2 编译带debug信息的应用程序
找到产生coredump的应用程序所在的代码包,通过devtool modify命令解压,并编译,如phosphor-network
devtool modify phosphor-network
bitbake phosphor-network
编译完成后,在phosphor-network/oe-workdir/image/usr/bin目录下可以找到带debug信息的应用程序phosphor-network-manager
3 使用GDB工具定位coredump信息
收集OpenBMC产生的coredump文件,通常为zst格式,通过命令进行解压:
zstd -d xxx.zst -o core1
其中xxx.zst文件为zst格式的coredump文件,core1为解压后的文件。
使用qemu将第一步编译出来的镜像运行起来,将带有debug信息的应用程序与解压后的coredump文件分别通过scp传送到运行的镜像下:
scp -P 2222 phosphor-network-manager root@127.0.0.1:/tmp
scp -P 2222 phosphor-network-manager root@127.0.0.1:/tmp
然后就可以使用GDB工具来查看coredump文件中的信息,命令格式为:
gdb <产生coredump的应用程序目录> <coredump文件目录>
如使用如下命令:
gdb /tmp/phosphor-network-manager /tmp/core1
进入gdb程序界面:
接下来输入bt指令可以查看更详细的信息:
从bt展示的信息中就可以发现问题出现的位置,更进一步定位问题了。