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

相关推荐
童先生6 小时前
Go 项目中实现类似 Java Shiro 的权限控制中间件?
开发语言·go
幼儿园老大*8 小时前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go
架构师那点事儿13 小时前
golang 用unsafe 无所畏惧,但使用不得到会panic
架构·go·掘金技术征文
于顾而言1 天前
【笔记】Go Coding In Go Way
后端·go
qq_172805591 天前
GIN 反向代理功能
后端·golang·go
follycat1 天前
2024强网杯Proxy
网络·学习·网络安全·go
OT.Ter2 天前
【力扣打卡系列】单调栈
算法·leetcode·职场和发展·go·单调栈
探索云原生2 天前
GPU 环境搭建指南:如何在裸机、Docker、K8s 等环境中使用 GPU
ai·云原生·kubernetes·go·gpu
OT.Ter2 天前
【力扣打卡系列】移动零(双指针)
算法·leetcode·职场和发展·go
码财小子2 天前
k8s 集群中 Golang pprof 工具的使用
后端·kubernetes·go