LWN: 想用python命令来调试kernel吗?drgn就是了!

drgn:可编写脚本的调试器库 gn drgn(发音为“ dragon”)是一种调试器,着重于可编程性。 drgn公开了程序中的类型和变量,以便在Python中轻松表达脚本。 例如,您可以调试Linux内核: >>> from drgn.helpers.linux import list_for_each_entry >>> for mod in list_for_each_entry( ' struct module ' , ... prog[ ' modules ' ].address_of_(), ... ' list ' ): ... if mod.refcnt.counter > 10 : ... print (mod.name) ... (char [56])" 立即下载

A kernel debugger in Python: drgn

By Jake Edge
May 29, 2019


LSFMM


2019 Linux Storage, Filesystem, and Memory-Management Summit (LSFMM)会议上,Omar Sandoval介绍了一款kernel调试器,可以利用Python脚本来访问正在运行的kernel里的数据结构。Sandoval是Facebook的一员,他经常需要调试一些kernel问题,总苦恼于当前的工具不太趁手。因此他创建了drgn,一个python library形式的kernel debugger(调试器)。


Sandoval首先对drgn(发音同dragon)进行了一个快速演示,登入一台虚拟机,然后用drgn -k命令就连上了当前在运行的Linux kernel,然后用python的交互式shell里的几行命令,查看了根文件系统的具体superblock信息,进而循环查看了这个superblock里缓存的inode的信息,包括它们对应的文件路径。然后他演示了一些更有趣的功能,例如列出所有大于1MB的文件的inode。还查看了size比较大的kernel module,库文件,systemd等等。


Sandoval平时经常开发Btrfs和块设备层的代码,不过他也需要调查各种kernel相关的奇怪问题。Facebok有非常多的服务器,有时会有一些“极其罕见的、百万分之一概率的问题”在他们的环境里隔一段时间出现一次。他都会主动帮助调查一下。这个过程中他熟悉了GDB, crash,还有eBPF,不过他很快发现他经常需要对kernel数据结构做各种复杂的分析,所以最终他自己开发了drgn来满足这一需求。

640


他认为GDB确实有很多优秀功能,包括能把各种类型、变量、公式都很漂亮的打印输出出来。不过它更擅长利用breakpoint(断点)方式的debug,而不适合他在生产环境里debug的需求。GDB支持脚本,但是只是对现有的GDB命令的包装,不够丰富。


Crash也是为内核调试专门开发的工具。它能很好的支持kernel里的链表(linked list,不知道有多少人知道晾衣夹这个梗——译者),各种结构,进程,等等。不过如果要调查其他的内容,就会感到很难下手了,因为它的扩展性不是很强。当Sandoval使用crash的时候,他经常得dump很多数据出来,用其他工具来做进一步的分析处理。


BPF和BCC也都是非常棒的工具,他用这些工具也很频繁。不过通常需要在bug出现的时候采集到具体信息,并且系统得保持正常运行状态,否则无法使用这些工具。很多他调查的bug都是好几个小时之前发生的,server也都因此挂死没法再执行shell命令了,或者他可能只是拿到一份memory dump内存映像文件来debug。这些情况下BPF都没有什么用处了,毕竟BPF主要是用来做tracing方式调试的,不适用于交互式的调试器场景。


Drgn主要目标是能用正式的编程语言来做调试,甚至可以写成真正的程序。Drgn能够很轻松的把需要的信息打印出来,写入文本文件,然后用脚本来处理;也可以直接用Python接口的GDB来调试。他有时候称呼drgn为“debugger as a library”,因为drgn不是像crash或gdb那样,仅仅提供了支持少数几个命令的交互界面。相反的,drgn把所有数据类型、变量等等都包装好了,你可以对他们做任何操作。可以查看这份User Guide来初步了解如何使用(https://drgn.readthedocs.io/en/latest/user_guide.html  )。


然后他进行了更进一步的drgn高级功能演示,包括交互式场景,也有脚本方式。首先是演示交互式调试场景,他先让drgn把一个变量作为一个目标object返回回来,这个object还包含更多信息,例如变量类型(也是另一个object),地址,当时的值等。开发者还可以通过链表循环来查看更多信息,他就演示了对struct task_struct这个链表进行遍历,列出了所有从init task到全部子进程的信息。


在现场演示如何使用这个链表遍历功能的时候,他告诉大家,如果经常要重复写这些命令,正常人都会感到乏味无聊。所以drgn还提供了一组helper function帮助函数,能把这部分工作简单化。目前,大多数都是文件系统和块设备层的常用功能,不过很快会加更多网络等kernel其他子系统相关helper function。


接下来,他演示了一次真实事件的debug过程,当时是跟同事一起调查一个虚拟机里的业务服务(production server,特指正在对外提供服务的服务器——译者)。这台服务器是一台存储服务器,主要存放cold data (指不常用的数据),因此磁盘会经常在一段时间没有访问之后被关闭来省电。这样磁盘经常on/off开关的场景下,就触发了一个kernel bug。这里的存储服务是运行在一个container(容器)里的,有时候停止container的操作会卡住无法结束。在他开始查看这个问题的时候,很快他发现container其实在很长时间之后还是停下来了,这里可能是有什么资源泄露了。现场他演示了如何查看block cgroup数据结构,以及Python Set object类型来调查每个block cgroup里的请求队列的数量。他也分析了ID allocator (IDA)关联的radix tree(IDA是用于区分请求队列的),来印证他的分析。最终他看到在一个引用循环(reference cycle)里面,request queue实际上发生了泄露,没有得到回收。


现场他还举了其他的一个例子,是利用drgn来调查Btrfs异常返回ENOSPC的问题。最终查下来是对孤儿文件(orphaned files)保留了额外的metadata空间导致的。一旦确认是这个问题,进而就确认了哪些进程一直在产生孤儿文件,这样在Btrfs的正式fix patch合入之前,可以周期性的重启这个进程来解决。此外,每次他需要调查一个不太熟悉的kernel subsystem的时候,他经常就会用drgn来查看里面的关键数据结构,从而帮助他理解这个子系统。


drgn的核心部分是一个libdrgn C语言库。假如有人不喜欢用python,也希望自己来处理各种异常情况的话,可以直接用C语言来调用libdrgn实现调试功能。drgn还有一组可以选择打开与否的后端程序帮助读取各种内存文件,例如正在运行的系统里的/proc/kcore文件,crash dump文件,或者/proc/<PID>/mem这样的特定进程的内存内容。drgn是用DWARF标准来获取数据类型和符号,这里倒是不如想象的容易,他花了比预想的多得多的时间来优化对DWARF数据的访问。这个接口也是可以扩展的,不过他目前只实现了DWARF。


优化之后,drgn只要半秒钟就能启动好,而crash需要大概15s的时间启动。drgn启动非常快,所以他越来越喜欢用它,每次要用crash的时候总是有点挠头。


drgn里面还嵌入了一个C语言实现的解析器。这样drgn就能处理不少特殊情况,例如需要做隐性的数据类型转换或者整形数的扩展等等。这部分实现也很麻烦,花了不少时间,不过这样他就能确保相应的转换过的代码运行过程跟在kernel里时一样了。


他也介绍了drgn目前缺失的最大功能是backtrace。现在只能访问全局变量,虽然说大多数情况下也够用了,不过他还是有时候不得不拿出crash工具来获取更多信息,然后帮助drgn来分析当时的情况。backtrace当然也是可以在drgn里支持的,只是他现在还没有完成这部分。后续他很想能用BPF Type Format(BTF)来取代DWARF,因为BTF更加小,更加简单。不过这里有个最大问题是BTF不支持变量,等BTF支持变量之后,他肯定会用BTF。此外他还在准备一组常用的drgn脚本和工具,会提交到git仓库里。


还有一个让他很烦恼的问题,就是是否集成BPF和BCC。有个想法是利用BPF来做存活系统上的debug(live debugging),而drgn用于出错之后的debug(after-the-fact debugging)。这两种工具有些地方是重复的,他还没有想好怎么能统一起来。BPF因为没有循环支持,所以有时候不太好用。而drgn又没法在bug发生的时候及时抓住现场,也不太爽。他有一个“疯狂的想法”,就是在BPF触发breakpoint的位置,调用到user-space的drgn进程,不过这里他还没有想清楚是否完全可行。


译者补充:在LWN的这则新闻下面,有很多评论者提到epython/pykdump,以及crash-python项目,之前经常用crash、并且喜欢python的话,可以试用一下这两个项目。


Python-用于检查Linux内核配置中加固选项的脚本 用于检查Linux内核配置中加固选项的脚本 立即下载

相关推荐

docker拉取镜像报错:Error response from daemon: Get “https://registry-1.docker.io/v2/“: dial tcp

docker拉取镜像报错:Error response from daemon: Get “https://registry-1.docker.io/v2/“: dial tcp

m0_55333789的博客 1556

探索未知,掌握一切 —— 强大的Python调试工具:drgn

探索未知,掌握一切 —— 强大的Python调试工具:drgn 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 drgn,发音为“dragon”,是一个以编程为中心的调试器,它将程序中的类型和变量暴露给用户,让你能够用Python编写优雅而富有表现力的调试脚本。这个项目的诞生是为了在大型程序中(如Linux内核)进行复杂的、多层次的状态检查提供一种更自然、更像编码的调试...

gitblog_00043的博客 581

【5G演进】4G到5G演进之网络架构与协议栈

4G到5G演进之网络架构与协议栈

Learning makes me happy (0^◇^0) 5529

drgn调试工具核心概念与使用指南

drgn是一个功能强大的调试器框架,主要用于分析Linux内核和用户空间程序。它提供了Python接口,允许开发者通过编写Python脚本来检查和操作正在运行或崩溃的程序状态。与传统的调试器不同,drgn更注重于程序状态的静态分析而非动态调试。 ## 快速入门 要开始使用drgn,首先需要安装它。安装完成后,可以通过命令行直接启动交互式环境: ```bash sudo drgn ``` 在

gitblog_00870的博客 477

AI对嵌入式的冲击分三波,大多数人只看到了第一波

摘要:AI对嵌入式行业的冲击将分三波递进:第一波(已发生)是代码生成,AI能完成底层驱动配置;第二波(1-2年内)是架构设计,AI将参与系统方案制定;第三波(2-3年)是需求验证,AI能穷举测试用例但无法替代安全决策。每波冲击都将重新定义工程师的价值标准,经验型工程师若不能将隐性知识转化为显性规则将面临淘汰。作者指出,完全不用AI的人第一波就会被淘汰,而仅满足于第一波应用的人将在后续冲击中落后。

u010898524的博客 961

Cadence仿真数字电路功耗

Cadence仿真数字电路功耗 数字电路的功耗采用平均电流乘电源电压获得,所以本文的关键是测量平均电流。 仿真前设置好仿真参数后,在仿真的ADE街边选择:outputs➡to be saved➡select on design 选择电源的负端电流(若选择正端,则电流为负): 选择完成后,在ADE界面讲所选节点的plot也勾选上,点击run。仿真完成后自动显示波形。在波形上选中该电流曲线,右击选择:send to➡calculator 注意上图中,商店前的波形不稳定,需要进行截取。在calculator

qq_41519780的博客 1万+

LWN:对生产内核使用drgn!

关注了就能看到更多这么棒的文章哦~Using drgn on production kernelsBy Jake EdgeNovember 28, 2023LPCChatGPT translationhttps://lwn.net/Articles/952942/drgn是由 Omar Sandoval 在 Meta 内核团队工作时开发的基于 Python 的内核调试器。他现在大部分时间都在致力于...

Linux News搬运工 1055

gcc/g++ 链接库的编译与链接

gcc/g++ 链接库的编译与链接 surgewong@gmail.com http://blog.youkuaiyun.com/surgewong       程序编译一般需要经预处理、编译、汇编和链接几个步骤。在实际应用中,有些公共代码需要反复使用,就把这些代码编译成为“库”文件。在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态(链接)库,其特点是可

Surge 4万+

使用drgn调试Linux内核:blk-rq-qos崩溃案例分析

在Linux内核开发和生产环境中,遇到内核崩溃是常见但棘手的问题。本文将通过一个真实的Linux内核崩溃案例,展示如何使用drgn工具进行深入分析。这个案例涉及Linux 6.11版本中块层(block layer)的一个bug,导致内核在生产环境中崩溃。 ## 准备工作 在开始分析前,我们需要准备以下环境: 1. 安装drgn工具(遵循官方安装指南) 2. 获取崩溃转储文件和调试符号 3.

gitblog_01148的博客 443

9篇3章3节:FAERS数据库公共仪表板搜索功能操作与解析

FAERS(FDA不良事件报告系统)公共仪表板是一个强大的工具,用于查询和分析药物及生物制品的不良事件数据。通过该仪表板,用户可以按药品或不良反应进行搜索,查看报告数量、事件类型及时间分布,从而辅助药物安全性分析和科研研究。本文重点介绍仪表板的搜索功能,包括按产品和按不良反应查询的操作步骤、筛选与多维数据分析方法,以及关键概念的解释,帮助用户科学、理性地使用FAERS数据,提升用药决策的准确性和安全性。

MD Code 1585

企业级托管钱包架构设计与MPC密钥管理:基于Go语言的生产级实践

本文探讨了2026年Web3生态中企业级托管钱包的技术架构与实现方案。文章指出,传统私钥管理模式已无法满足机构级资产管理需求,而基于多方安全计算(MPC)和门限签名(TSS)的技术方案成为主流选择。研究分析了托管钱包的四层架构设计,详细解读了MPC的核心技术原理,包括分布式密钥生成(DKG)和签名协议演进。通过Go语言实现案例,展示了密钥分片管理、DKG流程和交易签名等核心模块的代码实现。文章还提出了生产部署的安全原则、容灾设计和监控体系,并讨论了密钥撤销等现存挑战及TEE融合等未来趋势。研究为构建安全、高

分享AI、区块链技术及应用,未来已来 81

Linux网络设备分析

Linux网络设备分析 潘纲    9811536 浙江大学计算机系    pg@ccnt.zju.edu.cn [摘要] 在本文中,首先概括了网络设备总体特征和工作原理,接着在分析了一个 重要的数据结构device后,重点剖析了网络设备的整个初始化工作过程;简单地分 析了设备的打开和关闭的操作后,是有关数据包的传输和接收的分析;在最后,本 文对写网络设备驱动程序做了一个总结。以上

fivedoumi的专栏 1万+

STM32开发 -- LIS3DH三轴加速度计开发详解

这次要讲一下LIS3DH三轴加速度计的开发使用,之前是有讲过 MPU6050开发 的,但当时是在Linux下做的。额,还是个半成品,哈哈。现在手边有STM32的开发板,可以实实在在的来实现以下卡尔曼滤波了。 一、LIS3DH初识 依照惯例,先看一下手册,大致先了解一下,LIS3DH是什么模块。 下载:LIS3DH datasheet 1、描述 LIS3DH是一款超低功耗高性能三轴线性加速度计,属于...

不积跬步,无以至千里 2万+

BPF 文档

BPF Drgn工具 drgn脚本是一种方便且易于使用的机制,可以检索任意内核数据结构。 drgn不依赖内核UAPI读取数据。相反,它直接从/ proc / kcore或vmcore中读取,并根据来自vmlinux的DWARF调试信息漂亮地打印数据。 本文档介绍了与BPF相关的drgn工具。 有关当前可用的所有工具,请参阅drgn / tools;有关drgn本身的更多详细信息,请参阅drgn / doc。 bpf_inspect.py 描述 bpf_inspect.py是用于检查BPF程序和map的工具。

攻城狮 792

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

linux内核下进行调试的方法

简单逻辑错误printkdmesg。崩溃 / Oops:分析崩溃日志 +addr2line。复杂逻辑 / 启动问题:KGDB 断点调试。性能 / 流程分析:ftrace 动态追踪。严重崩溃 / 死锁:kdump +crash工具。内核调试的核心是利用内核自带的调试框架(如printk),并结合配置调试选项),多数情况下无需依赖第三方工具。

shanstellar的博客 1188

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

drgn与crash对比:为什么Meta选择开发这个新调试器

drgn是Meta开发的可编程调试器,专为内核调试设计,提供比传统crash工具更灵活的调试体验。作为一款开源工具,drgn通过Python API实现了强大的可编程能力,让开发者能够用熟悉的脚本语言构建复杂调试逻辑。 ## 🚀 核心差异:可编程性带来的变革 传统crash工具采用命令式交互模式,用户需要记忆大量专用命令。而drgn创新性地将Python作为调试接口,允许开发者编写脚本来自动

gitblog_00409的博客 1040

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Drgn调试工具支持架构与内核版本详解

Drgn是一个强大的调试工具,专门用于Linux内核和用户空间程序的调试分析。它提供了Python接口,允许开发者以编程方式检查运行中的系统或核心转储文件的状态。本文将详细介绍Drgn支持的各种架构特性、内核版本以及相关配置要求。 ## 架构支持矩阵 Drgn对不同处理器架构的支持程度有所不同,主要体现在以下三个关键功能上: 1. **Linux内核模块调试支持**:加载Linux内核模块的

gitblog_01107的博客 382

debuginfo详解

debuginfo是 Linux 系统中存储调试符号和源代码信息的特殊软件包,用于分析内核或用户态程序的崩溃转储文件(如vmcorecoredump它在调试复杂问题(如内核崩溃、程序段错误)时至关重要。

sre救赎之路 1951

drgn高级使用指南:深入Linux内核调试

drgn是一个功能强大的调试器,专为Linux内核和用户空间程序调试而设计。与传统的调试工具不同,drgn提供了Python接口,允许开发者以编程方式访问和分析调试目标。本文将深入探讨drgn的高级用法,帮助开发者充分利用这个工具的强大功能。 ## 调试符号管理 ### 非标准位置的调试符号加载 在实际生产环境中,调试符号可能不会安装在标准位置。drgn提供了多种方式来加载这些符号: 1.

gitblog_00761的博客 608

Extracting kernel stack function arguments from Linux x86-64 kernel crash dumps

It's common, when analysing a kernel crash dump, to look at kernel tasks' stack backtraces in order to see what the tasks are doing, e.g. what nested function calls led to the current position; this is easily displayed by the crash utility. We often want a

maimang1001的专栏 806

革命性调试工具drgn:10个核心功能让你彻底掌握Linux内核调试

drgn是一款强大的可编程调试工具,专为Linux内核调试设计。它允许开发者以编程方式探索内核数据结构和行为,提供了比传统调试工具更灵活、更深入的调试能力。无论是内核开发新手还是经验丰富的开发者,drgn都能显著提升调试效率,帮助快速定位和解决复杂的内核问题。 ## 1. 交互式命令行界面:直观探索内核状态 drgn提供了一个功能丰富的交互式命令行界面,让开发者可以实时探索内核状态。通过简单的

gitblog_01139的博客 306

jupyter中添加conda环境

安装完Anaconda利用conda创建了虚拟环境,但是启动jupyter notebook之后却找不到虚拟环境。 实际上是由于在虚拟环境下缺少kernel.json文件,解决方法如下: 首先安装ipykernel:conda install ipykernel 在虚拟环境下创建kernel文件:conda install -n 环境名称 ipykernel 激活conda环境: source a...

qq_42240804的博客 475

Anaconda的python环境管理 以及 jupyter notebook的kernel管理

相关文章: Anaconda 查看、创建、管理和使用python环境 在Jupyter nobetook当中添加Python虚拟环境 由于实验需要,要使用tensorflow 1的版本,这不得不使我去研究一下Anaconda的python环境管理和jupyter notebook的Kernel管理 一、Anaconda的python环境管理 1. 查看python环境 输入命令: conda info --env 就可以查看当前Anaconda有多少个python环境: 一开始有一个默认叫base的py

weixin_43826681的博客 647

学习python的我,为何越发觉得熟悉Linux内核真的很重要?

Python作为目前最为火爆的脚本语言,其丰富的Package库和跨平台等特性有目共睹。 曾今,以功能实现、产品交付为工作主导的我,自以为所谓的“跨平台”就是不需要去了解平台细节,Python语言底层都封装好了。 但如果想从性能方面思考自己的程序,多压榨机器资源来体现自身的专业素养,就不得不激发自己的好奇心,去了解这一个个“封装”都咋实现的,不同有什么区别。 比如,前几周开发Python爬虫时,就...

jrl137824675的专栏 813

linux内核安装python,【linux】【Python】python2.7安装pip9.0.1

推荐文章一、操作数据库(以SQLite3为例)?SQLite3 可使用 sqlite3 模块与 Python 进行集成。它提供了一个与 PEP 249 描述的 DB-API 2.0 规范兼容的 SQL 接口。我们不需要单独安装该模块,因为 Python 2.5.x 以上版本默认自带了该模块。为了使用 sqlite3 模块,首先必须推荐文章数据库的配置1 django默认支持sqlite,my...

weixin_42373893的博客 339

crash工具解析_crash工具和x86-64汇编基础

在前面的文章中,已经出现了作为Linux重要调试手段之一的crash工具的身影。在后续的文章里,我们还会继续用到它。因此在这里,准备对Linux中的crash工具的原理和使用方法,做一个相对全面的介绍。crash工具可用于从正在运行的内核获取信息,而更多的时候,则是用来分析产生的coredump文件,以定位内核陷入异常的原因。coredump文件本质上记录的是内核crash时的内存数据,因此通常被...

weixin_39947522的博客 648
下一篇: LWN:madvise()只能对本进程做,没想过控制别的进程吗?
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值