写在前面
在进行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工具
- 对
elfnot 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即可。