[containerd] 在Windows上使用IDEA远程调试containerd, ctr, containerd-shim
文章目录
- 1. containerd安装
- 2. 源码编译
- 3. 验证编译的二进制文件是否含有调试需要的信息
- 3.1. objdump工具验证
- 3.2. file工具验证
- 3.3. dlv工具验证
- 4. debug
1. containerd安装
[Ubuntu 22.04] 安装containerd
2. 源码编译
主要步骤如下:
- 1、从github下载
containerd源码git clone git@github.com:containerd/containerd.git
- 2、切换到想要
debug的分支或者tag,我这里选择切换到1.7.2版本的taggit branch v1.7.2 v1.7.2 && git checkout v1.7.2
- 3、下载
contaienrd的依赖cd containerd && go mod tidy
- 4、编译
containerd源码make build GODEBUG=true all
root@containerd:~/workspace/containerd#
root@containerd:~/workspace/containerd#
root@containerd:~/workspace/containerd#
root@containerd:~/workspace/containerd# make build GODEBUG=true all
+ build
+ bin/ctr
go build -gcflags=all="-N -l" -gcflags=-trimpath=/root/go/src -buildmode=pie -o bin/ctr -ldflags '-X github.com/containerd/containerd/version.Version=v1.7.2-2-gbe3ad13c1 -X github.com/containerd/containerd/version.Revision=be3ad13c14e0e1da2840fc6496f2bcefefb99764 -X github.com/containerd/containerd/version.Package=github.com/containerd/containerd ' -tags "urfave_cli_no_docs static_build" ./cmd/ctr
+ bin/containerd
go build -gcflags=all="-N -l" -gcflags=-trimpath=/root/go/src -buildmode=pie -o bin/containerd -ldflags '-X github.com/containerd/containerd/version.Version=v1.7.2-2-gbe3ad13c1 -X github.com/containerd/containerd/version.Revision=be3ad13c14e0e1da2840fc6496f2bcefefb99764 -X github.com/containerd/containerd/version.Package=github.com/containerd/containerd ' -tags "urfave_cli_no_docs static_build" ./cmd/containerd
+ bin/containerd-stress
go build -gcflags=all="-N -l" -gcflags=-trimpath=/root/go/src -buildmode=pie -o bin/containerd-stress -ldflags '-X github.com/containerd/containerd/version.Version=v1.7.2-2-gbe3ad13c1 -X github.com/containerd/containerd/version.Revision=be3ad13c14e0e1da2840fc6496f2bcefefb99764 -X github.com/containerd/containerd/version.Package=github.com/containerd/containerd ' -tags "urfave_cli_no_docs static_build" ./cmd/containerd-stress
+ bin/containerd-shim
+ bin/containerd-shim-runc-v1
+ bin/containerd-shim-runc-v2
+ binaries
root@containerd:~/workspace/containerd#
root@containerd:~/workspace/containerd#
root@containerd:~/workspace/containerd# ls -lhtr bin/
total 158M
-rwxr-xr-x 1 root root 31M Jul 29 14:34 ctr
-rwxr-xr-x 1 root root 61M Jul 29 14:34 containerd
-rwxr-xr-x 1 root root 29M Jul 29 14:34 containerd-stress
-rwxr-xr-x 1 root root 9.4M Jul 29 14:34 containerd-shim
-rwxr-xr-x 1 root root 12M Jul 29 14:34 containerd-shim-runc-v1
-rwxr-xr-x 1 root root 17M Jul 29 14:34 containerd-shim-runc-v2
root@containerd:~/workspace/containerd#
注意,编译的时候containerd会依赖btrfs文件系统,如果没有安装,编译的时候会报错(提示:linux/btrfs_tree.h: No such file or directory)。按照文档第一步安装containerd不会遇到这个问题。
3. 验证编译的二进制文件是否含有调试需要的信息
注意,以下三种验证方式,选择其中的一种验证成功即可。
3.1. objdump工具验证
正确的现象如下,执行objdump --syms bin/containerd是可以看到调试信息的
root@containerd:~/workspace/containerd# objdump --syms bin/containerdbin/containerd: file format elf64-x86-64SYMBOL TABLE:
0000000000000000 l df *ABS* 0000000000000000 Scrt1.o
00000000000003b4 l O .note.ABI-tag 0000000000000020 __abi_tag
0000000000000000 l df *ABS* 0000000000000000 go.go
00000000003ad4c0 l F .text 0000000000000000 runtime.text
00000000003ad4c0 l F .text 0000000000000059 internal/cpu.Initialize
00000000003ad520 l F .text 0000000000000537 internal/cpu.processOptions
00000000003ada60 l F .text 0000000000000026 internal/cpu.indexByte
00000000003adaa0 l F .text 0000000000000925 internal/cpu.doinit
00000000003ae3e0 l F .text 0000000000000006 internal/cpu.isSet
00000000003ae400 l F .text 000000000000001b internal/cpu.cpuid.abi0
00000000003ae420 l F .text 0000000000000011 internal/cpu.xgetbv.abi0
00000000003ae440 l F .text 0000000000000009 internal/cpu.getGOAMD64level.abi0
00000000003ae460 l F .text 000000000000007a type:.eq.internal/cpu.option
00000000003ae4e0 l F .text 00000000000000e6 type:.eq.[6]internal/cpu.option
00000000003ae5e0 l F .text 0000000000000003 runtime/internal/atomic.(*Int32).Load
00000000003ae600 l F .text 0000000000000003 runtime/internal/atomic.(*Int32).Store
00000000003ae620 l F .text 000000000000000d runtime/internal/atomic.(*Int32).CompareAndSwap
00000000003ae640 l F .text 000000000000000a runtime/internal/atomic.(*Int32).Add
00000000003ae660 l F .text 0000000000000004 runtime/internal/atomic.(*Int64).Load
00000000003ae680 l F .text 0000000000000004 runtime/internal/atomic.(*Int64).Store
00000000003ae6a0 l F .text 000000000000000f runtime/internal/atomic.(*Int64).CompareAndSwap
00000000003ae6c0 l F .text 0000000000000007 runtime/internal/atomic.(*Int64).Swap
00000000003ae6e0 l F .text 000000000000000d runtime/internal/atomic.(*Int64).Add
00000000003ae700 l F .text 0000000000000003 runtime/internal/atomic.(*Uint8).Load
00000000003ae720 l F .text 0000000000000003 runtime/internal/atomic.(*Uint8).Store
00000000003ae740 l F .text 0000000000000004 runtime/internal/atomic.(*Uint8).And
00000000003ae760 l F .text 0000000000000004 runtime/internal/atomic.(*Uint8).Or
00000000003ae780 l F .text 0000000000000024 runtime/internal/atomic.(*Bool).Load
00000000003ae7c0 l F .text 000000000000001f runtime/internal/atomic.(*Bool).Store
00000000003ae7e0 l F .text 0000000000000003 runtime/internal/atomic.(*Uint32).Load
00000000003ae800 l F .text 0000000000000003 runtime/internal/atomic.(*Uint32).LoadAcquire
00000000003ae820 l F .text 0000000000000003 runtime/internal/atomic.(*Uint32).Store
00000000003ae840 l F .text 0000000000000003 runtime/internal/atomic.(*Uint32).StoreRelease
00000000003ae860 l F .text 000000000000000d runtime/internal/atomic.(*Uint32).CompareAndSwap
00000000003ae880 l F .text 000000000000000d runtime/internal/atomic.(*Uint32).CompareAndSwapRelease
00000000003ae8a0 l F .text 0000000000000005 runtime/internal/atomic.(*Uint32).Swap
00000000003ae8c0 l F .text 0000000000000004 runtime/internal/atomic.(*Uint32).And
00000000003ae8e0 l F .text 0000000000000004 runtime/internal/atomic.(*Uint32).Or
错误的信息如下,会提示no symbols,这种二进制无法进行debug
root@containerd:~/workspace/containerd#
root@containerd:~/workspace/containerd# objdump --syms /usr/local/bin/containerd/usr/local/bin/containerd: file format elf64-x86-64SYMBOL TABLE:
no symbolsroot@containerd:~/workspace/containerd#
root@containerd:~/workspace/containerd#
root@containerd:~/workspace/containerd#
3.2. file工具验证
正确信息如下,会显示with debug_info, not stripped
root@containerd:~/workspace/containerd#
root@containerd:~/workspace/containerd#
root@containerd:~/workspace/containerd# file bin/containerd
bin/containerd: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=9bb291e61e1eceb23359dc29100845e5c1edf763, for GNU/Linux 3.2.0, with debug_info, not stripped
root@containerd:~/workspace/containerd#
root@containerd:~/workspace/containerd#
错误信息如下,会显示stripped,说明不包含调试信息,无法进行debug
root@containerd:~/workspace/containerd#
root@containerd:~/workspace/containerd# file /usr/local/bin/containerd
/usr/local/bin/containerd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=322f89b7e351fe2ccfaa0fe30de79c76d49d6e26, for GNU/Linux 3.2.0, stripped
root@containerd:~/workspace/containerd#
3.3. dlv工具验证
正确的调试信息如下:
root@containerd:~/workspace/containerd# dlv exec bin/containerd
Type 'help' for list of commands.
(dlv)
(dlv)
(dlv)
(dlv)
(dlv)
(dlv) exit
root@containerd:~/workspace/containerd#
root@containerd:~/workspace/containerd#
错误的调试信息如下,会提示:no debug info found
root@containerd:~/workspace/containerd#
root@containerd:~/workspace/containerd# dlv exec /usr/local/bin/containerd
Warning: no debug info found, some functionality will be missing such as stack traces and variable evaluation.
Type 'help' for list of commands.
(dlv)
(dlv)
(dlv)
(dlv)
(dlv) exit
4. debug
debug containerd步骤如下:
- 1、利用
ps -ef|gerp containerd查看containerd启动所需要的参数,这一步特别重要,尤其是在debug k8s源码的时候,k8s的每一个组件都带了很多命令行参数,想要调试这些组件,必须把这些组件的启动参数原封不动的加入到dlv调试命令当中- 注意,实际上执行上述命令之后会发现,
containerd并没有启动参数,因此无需关心。
- 注意,实际上执行上述命令之后会发现,
- 2、通过
dlv命令启动containerd,启动命令我们可以从IDEA remote debug功能拷贝过来dlv --listen=:12345 --headless=true --api-version=2 --accept-multiclient exec bin/containerd- 注意:这里在启动
contaienrd的时候没有指定任何参数,实际上也可以根据自己的情况加入containerd参数,譬如指定containerd的配置文件的位置(containerd默认配置文件为:/etc/containerd/config.toml),也可以指定调试的debug级别,譬如:dlv --listen=:12345 --headless=true --api-version=2 --accept-multiclient exec bin/containerd -- --config=/root/mycontainerd/config.toml --log-level=debug
- 3、在
IDEA启动debug,连接到远程调试- 注意:在启动
IDEA调试之前,你需要在想要debug的位置增加断点,否则程序启动会直接运行起来,等你这个时候打断点,很可能就晚了。 - 注意:在启动
IDEA调试之前,你需要修改IDEA操作系统标识为Linux
- 注意:在启动



执行dlv --listen=:12345 --headless=true --api-version=2 --accept-multiclient exec bin/containerd -- --log-level=debug命令之后,此时会阻塞在这里,千万不要使用ctrl + c,只有当IDEA连接上来的时候才会开始执行
root@containerd:~/workspace/containerd#
root@containerd:~/workspace/containerd# dlv --listen=:12345 --headless=true --api-version=2 --accept-multiclient exec bin/containerd -- --log-level=debug
API server listening at: [::]:12345
2023-07-29T15:06:45+08:00 warning layer=rpc Listening for remote connections (connections are not authenticated nor encrypted)

相关文章:
[containerd] 在Windows上使用IDEA远程调试containerd, ctr, containerd-shim
文章目录 1. containerd安装2. 源码编译3. 验证编译的二进制文件是否含有调试需要的信息3.1. objdump工具验证3.2. file工具验证3.3. dlv工具验证 4. debug 1. containerd安装 [Ubuntu 22.04] 安装containerd 2. 源码编译 主要步骤如下: 1、从github下载containe…...
Verilog语法学习——LV4_移位运算与乘法
LV4_移位运算与乘法 题目来源于牛客网 [牛客网在线编程_Verilog篇_Verilog快速入门 (nowcoder.com)](https://www.nowcoder.com/exam/oj?page1&tabVerilog篇&topicId301) 题目 题目描述: 已知d为一个8位数,请在每个时钟周期分别输出该数乘1/…...
打卡力扣题目九
#左耳听风 ARST 打卡活动重启# 目录 一、问题 二、解题方法一 三、解题方法二 四、两种方法的区别 关于 ARTS 的释义 —— 每周完成一个 ARTS: ● Algorithm: 每周至少做一个 LeetCode 的算法题 ● Review: 阅读并点评至少一篇英文技术文章 ● Tips: 学习至少一个…...
Python零基础入门(九)——函数,类和对象
系列文章目录 个人简介:机电专业在读研究生,CSDN内容合伙人,博主个人首页 Python入门专栏:《Python入门》欢迎阅读,一起进步!🌟🌟🌟 码字不易,如果觉得文章不…...
在linux上面部署activemq
1、下载 网址:ActiveMQ 注意:新版本5.17起 要求jdk11, 5.16兼容jdk8, 所以,确保已经安装 java11 或以上的版本 这里安装较新版:5.18.2,已经安装了java17 如何安装jdk17,请详见我的另一篇文章:linux…...
mysql的sql语句优化方法面试题总结
mysql的sql语句优化方法面试题总结 不要写一些没有意义的查询,如需要生成一个空表结构: select col1,col2 into #t from t where 10 这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样: create table #t…...
小程序 获取用户头像、昵称、手机号的组件封装(最新版)
在父组件引入该组件 <!-- 授权信息 --><auth-mes showModal"{{showModal}}" idautnMes bind:onConfirm"onConfirm"></auth-mes> 子组件详细代码为: authMes.wxml <!-- components/authMes/authMes.wxml --> <van-popup show…...
【Linux】简易shell外壳的制作
#include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h>#define NUM 1024 #define SIZE 32 #define SEP " "// 保存完整的命令行字符串 char cmd_line…...
TenserRT(四)在 PYTORCH 中支持更多 ONNX 算子
第四章:在 PyTorch 中支持更多 ONNX 算子 — mmdeploy 0.12.0 文档 PyTorch扩充。 PyTorch转换成ONNX: PyTorch有实现。PyTorch可以转化成一个或者多个ONNX算子。ONNX有相应算子。 如果即没有PyTorch实现,且缺少PyTorch与ONNX的映射关系&…...
前端高级面试题-浏览器
1 事件机制 事件触发三阶段 document 往事件触发处传播,遇到注册的捕获事件会触发 传播到事件触发处时触发注册的事件 从事件触发处往 document 传播,遇到注册的冒泡事件会触发 事件触发⼀般来说会按照上⾯的顺序进⾏,但是也有特例&#x…...
Mongodb 多文档聚合操作处理方法三(聚合管道)
聚合 聚合操作处理多个文档并返回计算结果。您可以使用聚合操作来: 将多个文档中的值分组在一起。 对分组数据执行操作以返回单个结果。 分析数据随时间的变化。 要执行聚合操作,您可以使用: 聚合管道 单一目的聚合方法 Map-reduce 函…...
Zabbix分布式监控配置和使用
目录 1 Zabbix监控的配置流程2 添加主机组3 添加模板4 添加主机5 配置图形6 配置大屏7 新建监控项7.1 简介7.2 添加监控项7.3 查看数据7.4 图表 8 新建触发器8.1 概述8.2 添加触发器8.3 显示触发器状态 1 Zabbix监控的配置流程 在Zabbix-Web管理界面中添加一个主机,…...
XCTF_very_easy_sql
简单的进行sql注入测试后发现不简单尝试一下按照提示 结合这句提示应该是内部访问,所以采用的手段应该是ssrf顺便看看包 唯一值得关注的是set-cookie说回ssrf唯一能使用的方式应该是Gopher协议找到了一个POST的python脚本 import urllib.parsepayload ""…...
[React]useMemoizedFn和useCallback对比
useMemoizedFn文档地址:https://ahooks.js.org/zh-CN/hooks/use-memoized-fn hooks组件内什么时候会更新自定义函数 在 React 中,自定义的 Hooks 内部的函数在以下常见的几种情况下会被重新赋值,导致更新引用: 组件重新渲染&…...
计算机毕设 深度学习人体跌倒检测 -yolo 机器视觉 opencv python
文章目录 0 前言1.前言2.实现效果3.相关技术原理3.1卷积神经网络3.1YOLOV5简介3.2 YOLOv5s 模型算法流程和原理4.数据集处理3.1 数据标注简介3.2 数据保存 5.模型训练 6 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题…...
完全背包
动态规划解题步骤 : 动态规划问题一般从三个步骤进行考虑。 步骤一:集合和集合的状态 所谓的集合,就是一些方案的集合。 用 g[i][j] 表示从前 i 种物品中进行选择,且总体积不大于 j 的各个选法获得的价值的集合。注意:g[i][j] 不是一个数…...
【软件测试】webdriver常用API演示(Java+IDEA+chrome浏览器)
1.元素定位方法 对象的定位应该是自动化测试的核心,要想操作一个对象,首先应该识别这个对象。一个对象就是一个人一样,他会有各种的特征(属性),如比我们可以通过一个人的身份证号,姓名…...
Linux安装MySQL 8.1.0
MySQL是一个流行的开源关系型数据库管理系统,本教程将向您展示如何在Linux系统上安装MySQL 8.1.0版本。请按照以下步骤进行操作: 1. 下载MySQL安装包 首先,从MySQL官方网站或镜像站点下载MySQL 8.1.0的压缩包mysql-8.1.0-linux-glibc2.28-x…...
多线程面试相关的一些问题
面试题 1. 常见的锁策略相关的面试题 2. CAS相关的面试题 3. Synchronized 原理相关的面试题 4. Callable 接口相关的面试题 1. 常见的锁策略 乐观锁 vs 悲观锁 悲观锁: 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都…...
【使用维纳滤波进行信号分离】基于维纳-霍普夫方程的信号分离或去噪维纳滤波器估计(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
