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

相关推荐
煎鱼eddycjy14 小时前
新提案:由迭代器启发的 Go 错误函数处理
go
煎鱼eddycjy14 小时前
Go 语言十五周年!权力交接、回顾与展望
go
不爱说话郭德纲1 天前
聚焦 Go 语言框架,探索创新实践过程
go·编程语言
0x派大星2 天前
【Golang】——Gin 框架中的 API 请求处理与 JSON 数据绑定
开发语言·后端·golang·go·json·gin
IT书架3 天前
golang高频面试真题
面试·go
郝同学的测开笔记3 天前
云原生探索系列(十四):Go 语言panic、defer以及recover函数
后端·云原生·go
秋落风声3 天前
【滑动窗口入门篇】
java·算法·leetcode·go·哈希表
0x派大星5 天前
【Golang】——Gin 框架中的模板渲染详解
开发语言·后端·golang·go·gin
0x派大星6 天前
【Golang】——Gin 框架中的表单处理与数据绑定
开发语言·后端·golang·go·gin
三里清风_7 天前
如何使用Casbin设计后台权限管理系统
golang·go·casbin