写在前面
在进行sonic-testbed
中的process monitor
用例调试的时候,发现swss
容器中的orchagent
进程产生coredump导致测试失败。本文将简单介绍coredump以及如何编译debug版本SONiC进行coredump调试。
SONiC中coredump的一些配置
由于SONiC中的服务基本上都是运行在docker中,所以需要使能docker产生coredump。需要做两件事:
- 在host上配置
/proc/sys/kernel/core_pattern
, 配置core文件路径以及名称 - 在docker中配置core文件大小限制
ulimit -c unlimited
下面是SONiC对core文件路径及名称的配置:
1 | root@cel-brixia2-01:/home/admin# cat /proc/sys/kernel/core_pattern |
即当产生core文件时,我们可以在/var/core/
路径下找到.
SONiC中core文件调试
普通的SONiC版本中是不带gdb
工具的,elf
文件也都是stripped
。在编译debug版本的时候,需要做两件事:
- 在docker中安装gdb工具
- 对
elf
not stripped或者主动添加symbols
信息
SONiC的编译系统提供了很方便的方法供用户编译debug版本,以swss
为例做步骤说明。
修改
rules/config
中的字段如下:1
2
3
4
5
6
7-# INSTALL_DEBUG_TOOLS = y
+INSTALL_DEBUG_TOOLS = y
-#SONIC_DEBUGGING_ON = y
-#SONIC_PROFILING_ON = y
+SONIC_DEBUGGING_ON = y
+SONIC_PROFILING_ON = y使用
make list
找到需要对应的target,如1
target/docker-orchagent-dbg.gz
之后
make target/docker-orchagent-dbg.gz
生成debug版本的容器,然后拷贝到设备上。加载镜像,生成debug版的容器
- 使用
docker load -i docker-orchagent-dbg.gz
载入编译好的debug版镜像 - 删除原来的容器
docker rm swss
- 修改
/usr/bin/swss.sh
文件--name=$DOCKERNAME docker-orchagent-dbg:latest
,指定使用debug版镜像生成容器 service swss stop
&&service swss start
生成新的容器
- 使用
对core文件进行调试
将/var/core
下的core文件拷到docker中,可以参见/usr/bin/swss.sh
中create docker
时挂载的目录,一般host上的/etc/sonic
会以只读的方式挂载到docker中。
使用gdb /usr/bin/orchagent core.file
进行调试的时候,我们会发现gdb是从/usr/lib/debug/.build-id/
下面读取symbols信息的。SONiC采用模块化增量的方式进行编译,原有的elf
文件依然是stripped
状态,但是在debug版本中会将里面的symbols信息提取出来放到一个deb包中,如swss-dbg_1.0.0_amd64.deb
。
- 这是针对某一具体的debug容器替换说明,如果对整个SONiC编译debug版本,修改完
rules/config
后,直接make target/sonic-broadcom.bin
即可。