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

相关推荐
梦想很大很大5 小时前
使用 Go + Gin + Fx 构建工程化后端服务模板(gin-app 实践)
前端·后端·go
lekami_兰10 小时前
MySQL 长事务:藏在业务里的性能 “隐形杀手”
数据库·mysql·go·长事务
却尘13 小时前
一篇小白也能看懂的 Go 字符串拼接 & Builder & cap 全家桶
后端·go
ん贤14 小时前
一次批量删除引发的死锁,最终我选择不加锁
数据库·安全·go·死锁
mtngt111 天前
AI DDD重构实践
go
Grassto3 天前
12 go.sum 是如何保证依赖安全的?校验机制源码解析
安全·golang·go·哈希算法·go module
Grassto4 天前
11 Go Module 缓存机制详解
开发语言·缓存·golang·go·go module
程序设计实验室5 天前
2025年的最后一天,分享我使用go语言开发的电子书转换工具网站
go
我的golang之路果然有问题5 天前
使用 Hugo + GitHub Pages + PaperMod 主题 + Obsidian 搭建开发博客
golang·go·github·博客·个人开发·个人博客·hugo
啊汉7 天前
古文观芷App搜索方案深度解析:打造极致性能的古文搜索引擎
go·软件随想