概要
最近再研究secretflow/kuscia , 正好过程中一起研究的小伙伴摸索出了一下debug的方法(感谢大佬),就来和大家分享一下。
这个debug的方法是借助了 共语言的调试工具 dlv。
提前说明这个方法用到了idea,其他ide能不能用这种方法debug不能保证呀
演示用的kuscia分支版本是 (v0.3.0b0 和官方提供的mvp包的版本一致),v0.4.0b0版本有大量改动,以及代码的重构
调整deploy脚本。
目标是 以 privileged 特权模式启动 容器,并暴露debug的端口
我们找到 /kuscia/scripts/deploy 目录下的 deploy.sh 脚本,打开它,找到这个方法
function deploy_master() {
....(这里就不全部复制了,太多了)
}
然后找到这一个指令,,也就是启动容器的指令(
不同版本这个指令可能有所不同
)
bash
docker run -dit --name="${domain_ctr}" --hostname="${domain_ctr}" --restart=always --network=${NETWORK_NAME} -m ${MASTER_MEMORY_LIMIT} \
--env NAMESPACE=${master_domain_id} \
-p "${DOMAIN_HOST_PORT}":1080 \
-p "${KUSCIAAPI_HTTP_PORT}":8082 \
-p "${KUSCIAAPI_GRPC_PORT}":8083 \
${env_flag} ${mount_flag} \
"${KUSCIA_IMAGE}" scripts/deploy/start_master.sh ${master_domain_id}
我们往这个指令加两部分
第一个是: --privileged 标识以特权模式启动容器
第二个是: -p "${debug端口}" 记住这个端口,后面要用
如下:
bash
docker run -dit --privileged --name="${domain_ctr}" --hostname="${domain_ctr}" --restart=always --network=${NETWORK_NAME} -m ${MASTER_MEMORY_LIMIT} \
--env NAMESPACE=${master_domain_id} \
-p "${DOMAIN_HOST_PORT}":1080 \
-p "${KUSCIAAPI_HTTP_PORT}":8082 \
-p "${KUSCIAAPI_GRPC_PORT}":8083 \
-p "2345":2345 \
${env_flag} ${mount_flag} \
"${KUSCIA_IMAGE}" scripts/deploy/start_master.sh ${master_domain_id}
容器里安装go环境和dlv工具
这里有两种方式,一个是容器启动后直接进入docker容器,在容器里面直接下载安装一个是加在dockerfile里面,让它创建容器的时候就去下载安装,两种我都会提及,区别不是很大。
手动安装
执行
docker ps
查看所有的容器,运行以下指令进入容器(master节点容器名一般为 你的linux用户名+"-kuscia-master")
bash
docker exec -it 容器id或者name /bin/bash
进去后,我们执行以下指令,安装go环境
go
# 安装go环境,dlv工具要依赖于go下载
yum install -y go
# 安装完执行 go version 查看是否安装成功
go version
安装dlv工具
bash
# 设置代理
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
# 下载dlv 工具
go install github.com/go-delve/delve/cmd/dlv@latest
# 执行一下指令,查看是否安装成功
/root/go/bin/dlv version
自动安装
我们找到这个目录下的dockerfile: /kuscia/build/dockerfile/kuscia-anolis.Dockerfile
我们往里面加入这些代码,让他在创建容器的时候就把需要的环境安装好
go
RUN yum install -y go && \
yum clean all && \
go env -w GO111MODULE=on && \
go env -w GOPROXY=https://goproxy.cn,direct && \
go install github.com/go-delve/delve/cmd/dlv@latest
把这段代码加到 kuscia-anolis.Dockerfile 这个dockerfile里面,
然后再kuscia的项目根目录下重新执行以下指令:
yaml
# 重新打镜像
make image
# 重新创建容器
./scripts/deploy/deploy.sh master -i 1.1.1.1 -p 1080 -k 8082 -g 8083
监听主进程
安装成功dlv之后,我们执行以下指令
perl
ps -ef | grep -v "air" | grep -v "/bin/sh"
找到kuscia的主进程id:
编辑
主进程应该是 /hom/kuscia/bin/kuscia master 这个 。。。。复制它的pid,然后我们执行这个指令:
css
/root/go/bin/dlv attach ${主进程PID} --headless --listen=:${准备的debug端口} --api-version=2 --accept-multiclient
出现如下输出则说明监听成功了
编辑
然后我们打开idea,创建一个 go Remote:端口选择刚刚用的debug端口,,host根据情况选择,如果是本机的话,直接localhost
编辑
然后连接,这样就可以debug了,,,如果要里面看看有没有连接成功,去 monitor.go里面打几个断点即可,这里面有一些类似探活的操作,会定时自动触发。
小结
这就是如何debug的全部内容了,如果有什么错误欢迎大家指正,共勉!