Code Debug and Inject

Linux内核调试工具之Kprobes简单使用 Linux内核调试工具之Kprobes简单使用上次看了下Kprobes的相关概念:Linux内核调试工具之Kprobes相关概念,这里看看它的简单使用 配置Kprobes内核需要打开以下配置: CONFIG_KPROBES = y #保证能加载和卸载基于Kprobes的模块 CONFIG_MODULES = y CONFIG_MODULE_UNLOAD = y #kprobes例子:内核源码/samples/kprobes/kprobe_example.c。Linux内核调试工具之Kprobes简单使用。 阅读详情

分类: LINUX

欢迎转载,转载请保留文档完整性!

From:http://blog.chinaunix.net/uid-20662820-id-3799149.html

 

Code Debug and Inject

Author: Tony tingw.liu@gmail.com

Date:2013年7月11日星期四

 

1.   Debug

Linux下较新的内核调试是Kprobe,应用层框架是Ptrace和Utrace。gdb正是基于ptrace实现。

由于应用层程序可能不在内存中,而且可能存在一个程序多次执行的情况,所有内核层的调试不能直接调试应用层程序。

2.   Kprobe

2.1.    About kprobe

Kprobe机制是内核提供的一种调试机制,它提供了一种方法,能够在不修改现有代码的基础上,灵活的跟踪内核函数的执行。kprobe已经被Linus纳入主树,只需要内核选项“CONFIG_KPROBES=y”就可以开启kprobe功能。

Kprobe提供了三种形式的探测点,一种是最基本的kprobe,能够在指定代码执行前、执行后进行探测,但此时不能访问被探测函数内的相关变量信息;一种是jprobe,用于探测某一函数的入口,并且能够访问对应的函数参数;一种是kretprobe,用于完成指定函数返回值的探测功能。其中最基本的就是kprobe机制,jprobe以及kretprobe的实现都依赖于kprobe。

2.2.    How kprobe works?

对于kprobe功能的实现主要利用了两个功能特性:trap(x86/x64下是int 3),单步执行(EFLAGS中的TF标志)。

kprobe功能初始化时会注册到die_notifier通知链,该通知链在trap、debug异常的时候被调用,从而使得kprobe可以感知trap、debug异常。

通过kprobe查看探测点的大概的流程:

 1)注册探测点

kprobe会对被探测地址的指令码进行替换,替换为int 3(trap)的指令码,并将原有地址和指令码保存。同时会保存用户希望在探测点执行的代码pre_handler(指令码)。

 2)内核执行到探测点

由于探测点的指令码被修改为trap,触发trap异常。通过do_int3-->notify_die调用到kprobe的回调函数。

 3)在kprobe回调函数中处理trap异常

kprobe根据寄存器中RIP(x64),计算出触发异常的RIP(寄存器RIP中存放着触发异常的下一条指令的地址)。

kprobe根据计算出的RIP与第一步中保存的地址相比较,判断是否是探测点。

执行第一步中保存的pre_handler

 4)执行原有的指令

通过设置EFLAGS中的TF标志位,进入单步调试模式,并且把异常返回的地址修改为第一步中保存的原指令码;

 5)回复执行流程

因为进入单步调试模式,原有指令码执行完成后,会触发DEBUG。通过do_debug-->notify_die调用到kprobe的回调函数。

 6)在kprobe中恢复原有执行流程

kprobe修改RIP中保存的异常返回的指令地址为第一步中保存的指令地址的下一条地址。DEBUG异常返回后,调整到RIP中执行,原有流程恢复。

2.3.    How kretprobe works?

kretprobe利用kprobe实现,可以在函数返回之前添加要执行的代码。kretprobe的大概流程:

         1)在调用函数的call指令后添加kprobe

         2)kprobe的回调函数会记录下call指令保存的函数返回的return地址,并将该地址替换为一个特殊的“trampoline”。

         3)kprobe在trampoline地址上注册kprobe,该kprobe会调用用户定义的代码。

         4)当函数返回时,会执行“trampoline”,从而运行之前注册的用户定义代码。

3.   Utrace

3.1.    About Utrace

Utrace是Red Hat的Roland McGrath编写,是 Linux内核中最新的 trace和 debug基础构架。正如其名称所暗示,utrace为运行在用户态的进程提供 trace和 debug支持。

Utrace在2007年第一次提交到内核邮件列表,但是由于Linus的强烈反对(http://yarchive.net/comp/linux/utrace.html),目前Utrace仍然只在-mm分支,并不在Mainline。用户要想适应utrace,需要自己给内核打patch。

关于Utrace的介绍可以参考http://www.ibm.com/developerworks/cn/linux/l-cn-utrace/。

4.   Systemtap

4.1.    About Systemtap

SystemTapprovides free software (GPL) infrastructure to simplify the gathering ofinformation about the running Linux system. This assists diagnosis of aperformance or functional problem. SystemTap eliminates the need for thedeveloper to go through the tedious and disruptive instrument, recompile,install, and reboot sequence that may be otherwise required to collect data.

SystemTapprovides a simple command line interface and scripting language for writinginstrumentation for a live running kernel plus user-spaceapplications. We are publishing samples, as well as enlarging the internal"tapset" script library to aid reuse and abstraction.

Amongother tracing/probing tools, SystemTap is the tool of choice for complex tasksthat may require live analysis, programmable on-line response, and whole-systemsymbolic access. SystemTap can also handle simple tracing jobs.

Currentproject members include Red Hat, IBM, Hitachi, and Oracle.( http://sourceware.org/systemtap/)

4.2.    How Systemtap works?

Kprobe和Utrace提供了内核态和用户态探测函数的接口,用户可以直接编写内核模块来实现debug/inject。鉴于内核模块的编写需要较高的门槛,Systemtap通过提供一个框架,只需要用户编写脚本就可以实现debug/inject。

用户需要编写systemtap脚本,然后systemtap框架将脚本转换成内核C代码,编译成内核模块,实现代码的debug/inject。

5.   Demo(SLES11SP2)

5.1.    Prepare

5.1.1.     Kernel Utrace

SLES11SP2已经应用了utrace patch,但是默认内核没有开启。修改开启UTRACE选项,重新编译内核

5.1.2.     Systemtap

zypperinstall systemtap

5.1.3.     Glibc debuginfo

如果需要debug/inject glibc库,需要安装对于的debuginfo安装包。

zypperca

zypper mr-e SLE11-SP2-Debuginfo-Core

zyppermr -e SLE11-SP2-Debuginfo-Updates

rpm -qiglibc

zypperinstall glibc-debuginfo-2.11.3-17.31.1(这里需要确保安装的debuginfo的版本与系统glibc版本完全一致)

5.2.    Coding program which will be injectd


5.3.    Systemtap scripts


5.4.    Run program


5.5.    Inject program


6.   What we can do with it?

PerformanceTuning

Debugkernel

Debugapplication

Injectrunning program

Injectlibray

……

7.   Appendix

7.1.    Per event performance

Claude Code 部署指南:Node.js、VS Code 与环境治理全解析 Claude Code 并非普通代码补全插件,而是首个面向工程实践的 agentic 编码代理,其核心依赖于 Node.js 运行时、VS Code 编辑器 API 与 Anthropic 云服务的三层协同。理解其‘部署’而非‘安装’的本质,是规避 npm.ps1 报错、VS Code 集成失效、API 认证泄露等高频问题的前提。通过用户级 npm prefix 配置可根治 Windows 权限冲突;借助 nvm 实现 Node.js 版本精准管控;结合 VS Code 工作区信任与 CLI 扩展安装保障集 阅读详情

相关推荐

Claude Code与Kimi K2双工具协同开发实战指南

在AI原生开发范式下,代码生成与知识调度正成为两大基础能力支柱。Claude Code本质是嵌入VS Code的语义补全引擎,依托Anthropic模型实现上下文感知的函数级代码生成;Kimi K2则是企业级RAG平台客户端,通过Skill配置驱动跨文档、跨系统的结构化知识调用。二者能力正交互补:前者解决‘怎么写’,后者回答‘该写什么’。技术价值体现在工程提效(如需求→代码闭环压缩至22分钟)、合规增强(私有知识注入替代通用幻觉)及协作升级(开发者与业务专家通过YAML Schema对齐语义)。典型场景包括

weixin_30457465的博客 462

SUSE源码包与debuginfo包

https://pan.baidu.com/s/1nvO1DkH

cgm88s的专栏 2417

Claude Code插件:AI驱动的VSCode开发效率工具详解

AI代码辅助工具正在改变现代软件开发流程,通过自然语言处理与机器学习技术实现智能代码补全、错误检测和自动化重构。这类工具的核心价值在于将重复性编码工作自动化,显著提升开发效率,特别适用于快速原型开发、遗留系统维护和技术文档生成等场景。以VSCode插件Claude Code为例,其深度集成了代码解释、智能重构和文档生成等实用功能,通过/explain、/refactor等命令实现即时AI辅助。开发者可以快速生成符合PEP8规范的Python代码,自动创建单元测试用例,甚至完成复杂的多线程问题诊断。结合API

weixin_30655569的博客 520

Linux内核调试方法总结 一

内核开发比用户空间开发更难的一个因素就是内核调试艰难。内核错误往往会导致系统宕机,很难保留出错时的现场。调试内核的关键在于你的对内核的深刻理解。  一  调试前的准备 在调试一个bug之前,我们所要做的准备工作有:  有一个被确认的bug。包含这个bug的内核版本号,需要分析出这个bug在哪一个版本被引入,这个对于解决问题有极大的帮助。可以采用二分查找法来逐步锁定bu

bugouyonggan的专栏 2546

node-red教程3.1 inject介绍

node-red inject节点的介绍与使用

知无涯 1万+

kernel-debuginfo-common-2.6.18-8.el5.i686.rpm

Linux内核调试需要的debuginfo,对应内核版本为2.6.18-8

一个suse11 sp1的crash工具版本问题

这几年排查的各种类型的crash也比较多了,各种类型的也算见过,但是排查这个crash,走了不该走的弯路,事后显得很low,为了防止自己犯类似错误,也同时提醒后人,记录之。 内核是suse11,sp1, uname -a Linux Ftp1 2.6.32.59-0.7-default #1 SMP 2012-07-13 15:50:56 +0200 x86_64 x86_64 x86_...

weixin_34244102的博客 593

SUSE源码包与debuginfo包-附件资源

SUSE源码包与debuginfo包-附件资源

Linux 下的一个全新的性能测量和调式诊断工具 Systemtap,第 1 部分: kprobe

http://www.ibm.com/developerworks/cn/linux/l-cn-systemtap1/index.html kprobe 的原理、编程接口、局限性和使用注意事项 杨 燚 (yang.y.yi@gmail.com), 计算机科学硕士, Intel 简介: 本系列文章详细地介绍了一个Linux下的全新的调式、诊断和性能测量工具Systemtap和它所依

hnllei的专栏 1605

保姆级教程:用Altium Designer 24从零画一块PCB(附完整库文件与避坑清单)

本文提供了一份详细的Altium Designer 24(AD24)PCB设计教程,从工程创建到最终文件输出,涵盖元件库管理、原理图设计、PCB布局布线等全流程。特别适合初学者,包含STM32最小系统板的实战案例,附完整库文件和避坑清单,帮助用户快速掌握AD24的核心功能与技巧。

weixin_27697385的博客 249

深入了解AES_GCM算法

常见的对称加密算法,在解密过程中无法确认密钥是否正确的。这就意味着,密文可以用任何密钥执行解密运算,得到一组疑似密文;由于不知道密钥是否正确,故也不能确定解密出来的明文数据是否正确。因此,需要在对称加密算法上增加一层验证机制,常见思路为使用加密算法进行加密保证机密性,使用摘要算法计算MAC保证完整性和真实性,这就涉及到摘要计算和加密计算的前后顺序和参与计算的数据、密钥等,使用起来略微麻烦。

huaqianzkh的专栏 4190

Suse 11 Code Debug and Inject

http://blog.chinaunix.net/uid-20662820-id-3799149.html 欢迎转载,转载请保留文档完整性!   Code Debug and Inject Author: Tony tingw.liu@gmail.com Date:2013年7月11日星期四   1.    Debug Linux下较新的内核调试

onlyForCloud的专栏 920

群晖NAS实战:Python项目部署全流程解析

本文详细解析了在群晖NAS上部署Python项目的完整流程。从开启SSH、选择连接工具,到通过套件中心一键安装Python3、配置pip及国内镜像源,再到上传项目、安装依赖、后台运行及排错,提供了清晰的避坑指南。旨在帮助用户将群晖NAS从存储设备转变为可执行自定义任务的智能服务器,实现自动化脚本、数据监控等应用。

weixin_29057163的博客 593

Python Inject与Django集成:解决多模块加载问题的终极指南

Python依赖注入框架python-inject为Django项目带来了优雅的解耦方案,但Django的多模块加载机制常常导致`InjectorException: Injector is already configured`错误。本文将深入探讨如何完美集成python-inject与Django,解决多模块加载问题,并提供最佳实践方案。 ## 为什么Django需要依赖注入?🤔 Dja

gitblog_00352的博客 339

手把手教你学simulink(43.2)--光伏发电场景示例:基于Simulink开发一个光伏发电系统仿真模型:采用神经网络控制策略进行优化

需求分析光伏发电系统(Photovoltaic System, PV)是将太阳能转换为电能的重要手段,广泛应用于分布式发电、并网发电和离网供电等领域。随着光伏技术的发展,如何提高光伏发电系统的效率和稳定性成为研究的重点。传统的控制策略(如PID控制器)虽然简单易实现,但在复杂工况下(如光照强度变化、温度波动等)难以达到最优性能。因此,引入先进的控制策略,如神经网络控制(Neural Network Control, NNC),可以显著提升系统的响应速度和鲁棒性。

MHD0815的博客 438

JavaScript教程-字符集,Unicode转义序列,标识符,数据类型,数字,未定义值,浮点数,字符串,引用数据类型,类型检测,类型转换,运算符,关系运算符,

前端学习

VAN 213

OpenSpec规范执行引擎:从命令行到Spec-as-Code的跃迁

规范驱动开发(SDD)是一种将业务逻辑以声明式方式编码为可验证、可版本化、可协作的结构化规范的工程范式。其核心原理在于将传统脚本中的隐式流程(如curl+jq+awk拼接)升维为具备语义约束、分层校验与DAG调度能力的执行契约。技术价值体现在统一异构工具语义、实现跨环境可复现、支撑CI/CD原生审计——例如将Linux命令、Redis操作、HTTP调用等通过type: exec/type: redis/type: http插件标准化为JSON输出结构,使断言、过滤、编排成为可能。典型应用场景包括API契约测

weixin_33896726的博客 516

点云焊缝提取

本文介绍了一个基于PCL库的点云处理流程,包含三个核心模块:MLS平滑处理通过多项式拟合修正点云位置;差异提取通过双向匹配定位源/目标点云的非重叠区域;统计过滤剔除离群噪声点。该流程采用"平滑-筛选-净化"的通用思路,将复杂算法封装为可配置接口,实现了工业级点云预处理。文章重点分析了各模块的原理、PCL接口调用及参数设计逻辑,同时指出参数调优、算法扩展等深入探索方向,展现了PCL在点云处理中的模块化优势与实用价值。

weixin_45196569的博客 250

Claude持久化记忆方案:Code-First本地化记忆中间件

大语言模型的会话状态缺失是当前人机交互的核心瓶颈,其本质源于无状态上下文管理机制——每次新开对话即清空历史。解决该问题的关键不在于提升模型能力,而在于构建可控、可审计的外部记忆系统。基于SQLite本地存储、YAML声明式规则与两级精准注入机制,本方案实现低延迟、高隐私、可嵌入的记忆增强,支持键值记忆、语义检索与版本化生命周期管理。面向开发者,它以Python包形式提供工程级抽象,兼容Anthropic官方SDK,无需第三方云服务或黑盒插件,适用于命令行、VS Code、API网关等多场景。Claude-M

diejiankuai3444的博客 401

LVGL嵌入式GUI工程化架构与多窗口实践

嵌入式GUI开发中,LVGL作为轻量级图形库,其核心价值在于高效渲染与事件驱动机制。理解LVGL的对象树模型、资源管理机制(如RAW图像、静态字体)和屏幕生命周期,是构建稳定界面的基础。结合FreeRTOS等实时操作系统,可实现低功耗、高响应的交互体验。典型应用场景包括智能电表、HMI人机界面、工业控制面板等对内存敏感、需长期运行的设备。本文以微信式多窗口架构为范例,深入解析LVGL工程化落地的关键路径:分层目录结构、窗口模块封装、状态机式登录逻辑、TabView多页导航及图表/仪表盘动态可视化,覆盖从资源

weixin_36001279的博客 88

Flutter SDK的删除与重装:一步步教你如何轻松搞定

在Flutter开发过程中,我们可能会遇到一些需要重新安装Flutter SDK的情况,例如升级Flutter版本、解决依赖冲突等。本文将详细介绍如何删除并重新安装Flutter SDK,让你轻松应对各种问题。

理论都是虚的,代码才是王道。 2247

【Unity】使用XLua进行热修复

(4)运行Hotfix Inject In Editor。//打印“已被修复”(1)将XLua的Tool拖入Asset。编写脚本(注意类上带有[Hotfix])Debug.Log("未被修复");(3)运行Genrate Code。print('已被修复')

weixin_47220117的博客 1111

OV9734 DATASHEET,完整规格书

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

Claude Code vs OpenCode:AI编程助手的架构差异与工作流重构

AI编程助手已从简单代码补全演进为开发工作流的核心组件。其底层架构——是封闭单体沙箱还是开放模块代理——直接决定上下文处理能力、网络适应性、CI/CD集成深度及企业合规可行性。OpenCode以LSP协议桥接、AST级分析和models.dev抽象层,实现模型可替换、上下文可追溯、执行可审计;Claude Code则依赖静态AST快照与强绑定模型,在复杂项目中易受上下文截断与网络延迟制约。尤其在国产模型支持(如Qwen2.5-Coder)、弱网鲁棒性及私有化部署等维度,模块化设计展现出面向国内开发者的真实工

aibiba0894的博客 428

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

go函数的匿名调用,inject/Invoke,protobuf方法的调用

一、由于以前的代码是通过pb来传输数据的,大体流程是:前端—>后端的接口–>后端再请求pb服务接口。示例代码如下: 1.接收前端参数 // @Summary LTV趋势 // @Description LTV趋势 // @Tags 投放数据/LTV数据 // @Accept application/json // @Product application/json // @Param data body dass.GetLtvDataListRequest true "body" // @Su

疾风行的博客 780

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: MMU基础知识
下一篇: Linux 内核模块实现udp发送字符串
asmxpl
博客等级 码龄15年 9粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值