secretflow/kuscia 远程调试教程(dlv工具)

概要

最近再研究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的全部内容了,如果有什么错误欢迎大家指正,共勉!

相关推荐
名字还没想好☜2 小时前
Go context.AfterFunc 实战(Go 1.21):context 一取消就自动跑清理,告别手写 goroutine 监听 Done
后端·golang·go
liyinchi19882 天前
微信小程序支付遇到“由于小程序违规,支付功能暂时无法使用” 解决办法
java·微信小程序·go
天天喝旺仔2 天前
Go 泛型实战:从类型参数、约束到可复用泛型容器与函数
数据结构·算法·容器·go
gospace2 天前
【无标题】
go·gb28181·gowvp
我不会起名字3222 天前
一天一道算法题(35):电话号码的字母组合
java·数据结构·后端·python·leetcode·go·回溯
江湖十年3 天前
Go GOPROXY 兜底链的坑:从一次诡异的 CI lint 失败说起
后端·面试·go
秋风点枝3 天前
gogogo!go语言感悟大观--打卡day01
go·devops
探索云原生3 天前
KubeClipper 1.7.0 发布:Operation 优化与 Kubernetes 1.37 支持
linux·docker·云原生·kubernetes·go
右耳朵猫AI3 天前
Go周刊2026W37 | Ebitengine 纯 Go 化、simd 重写 TurboPFor、json/v2 落地
后端·微服务·go
福兮说4 天前
Gin 项目里的错误处理:让 Controller 不必知道错误是怎么来的
后端·go·gin·架构设计