程序调试器原理

微信开发工具及微信小程序开发原理总结 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma... 阅读详情

调试器原理:

 

   调试器是一个程序,在开发工具中也是调用一个程序,在运行时就是一个进程,这个进程与普通进程没有区别,只是这个进程调用了内核的一些特殊函数(系统调用)来操纵内核数据,这些数据就是被调试进程的内存数据。

 

而对操作系统调试的调试器则不同,因为没有操作系统的支持,调试器本身就不再需要调用操作系统内核的程序来支持,但是此时的调试非常特殊,因为操作系统自己有中断处理程序,调试器对中断服务程序的劫持会让操作系统的操作变得有些不同,调试器首先启动先设置CPU为单步执行状态,然后启动操作系统的代码,每执行一条指令,CPU均产生中断进入调试器程序(中断服务程序)。

通常内核调试紧紧是通过输出信息(如printk)来调试,这其实已经不是调试,而是嵌入代码进行测试,即使是kgdb也是在内核中插入了代码来实现调试,如让windows运行时启动调试模式,那么其内核中的调试代码就起作用了,这些调试是内核设计者预先设计好的。

 

在操作系统下调试程序,只是调试用户态代码,而用户态代码是出于操作系统控制之下的,因此调试就是借助操作系统来操作目标进程。

  无论windows还是unix中,都是通过对系统调用的劫持来实现对目标程序的调试的,如果操作系统内核不实现对程序的调试功能,那么调试器是不可能实现对另一个进程控制的。调试器通过创建子进程,并告诉操作系统(创建进程的状态设置)自己要对子进程进行调试,那么操作系统装载目标程序时,如果发生了规定的事件,就会停止目标进程的执行,此时对于目标进程来说,根本不知道操作系统为什么将自己停了,因为目标进程此时正在处于系统调用中,如线程创建、退出、发生异常等,而这时的内核代码就会检查当前进程是否处于调试状态,如果是,那么就启动调试器进程,这里所说的事件的发生是由操作系统内核实现的,基本是与内核的进程(线程)操作有关。

当目标进程中断后,调试器也必须通过内核才能实现读取目标进程的内存,如果不是这样,进程间可以互相读写进程就会让操作系统的内存保护功能失效了。

内核对于目标进程的内存读写是相当简单的,就是找到目标进程的页表,遍历页表找到虚拟内存对应的实际内存地址(物理地址),然后读写这个内存,对目标进程的寄存器也是一样,内核很容易获得目标进程的进程块,其中保存了目标进程的所有寄存器值。

如果没有对目标进程启动的事件中断,那么目标进程就会一直执行,不会受调试器的控制。正因为内核实现了目标进程一旦创建后就会让其中断,然后等待调试器进程的指令。

调试器在目标进程刚准备好就获得了目标进程的控制权,然后如果调试器直接run目标进程,那么目标进程就会处于失控状态,只有当系统事件(如线程创建、退出、DLL装卸载等)发生时内核才会中断目标进程,启动调试器。

因此调试时,通常在一开始就要实现对目标进程的单步调试或在目标进程中实现断点,这样目标进程才会频繁中断或在目标位置中断,然后交给调试器处理。

设置单步调试比较简单,设置CPU的状态寄存器的TF位,那么CPU每执行一个指令就会产生中断,当然如果目标程序是执行系统调用,那么内核会清除这个状态位,因此一旦进入内核,CPU就不是单步执行了,而是只有等系统调用返回才能执行下一步调试。

 

单步调试可以让我们实现很多功能,如果有源代码,那么我们执行源代码调试时,程序会编译带上调试信息,而在其中会构建符号表,行号等信息,每条指令会对应源程序行号,目标程序每执行一个指令,就产生中断,而内核中断服务程序就调用调试器来处理,调试器启动后,当然还是通过系统调用来读写目标程序的内存,当然首先还是判断当前执行的指令是属于源程序的哪行产生的代码,因此调试器会维护很多关于源程序与目标代码之间的关联信息。这需要编译器的支持,经过优化后,源代码与目标代码之间的对应关系有时也许并不那么明显。

 

当然要设置断点调试,就不是这么单步执行,其实在源代码调试时,也可以通过设置断点来实现调试,调试器也通常这样做。 调试器通过修改断点地址的指令代码来实现中断,修改为中断指令后,目标进程一执行到这里就会产生中断(异常),然后操作系统就会启动调试器来接管。因此必须在以上提到的系统事件发生时,调试器才能设置断点,例如在进程启动时刻,调试器会获得控制权,此时就可以通过修改目标进程的内存来实现断点。而设置断点时,当然调试器会将断点处的内存保存下来,一次可以设置多个断点,那么调试器必然会保存地址与内存值对应的表。当断点中断发生时,调试器等待用户指令操作完,进行run操作时,调试器就通过重新写回目标断点处的指令,目标程序接着执行。

当然要设置断点,就必须对目标程序非常了解,否则,你设置断点时,修改的是一个指令的部分(产生非法指令异常),或者是一个数据(没有反应)。设置断点是有目标的,首先我们要遍历目标程序的内存,或者通过反编译找到要调试的目标代码,然后通过对可执行文件的分析,找到代码加载到内存的位置,这样我们才可以设置断点。

当然对于源代码级别的断点设置,因为有源代码和调试信息的支持,比较容易找到源代码与加载到内存的指令地址的关系,设置断点就比较容易。因此有源代码的调试就比直接的内存进程调试相对简单。

调试器中,经常要用到符号表,符号表是一个调试器用来解释目标内存数据意义的数据表,如获得一个目标进程内存地址的数据后,如果没有符号表,那么我们只能看到一堆二进制数据,如果用符号表解释出来,那么就会知道内存中保存了什么。

调试器可以将内存转换成某个对象,按照某个结构体解析数据,然后我们就可以发现每个对象成员的值。前提是我们知道这个位置保存了某个类型的对象,如果实际上不是,那么解析结果就是无意义的。

还有一种符号表,假定对象在内存中的位置是不变的,那么我们可以通过地址中的数据就可以构建起对象。

对于内核调试中,我们通常通过结构体(符号表)解析某个地址内容的意义。当然调试器通常没有对象的识别能力,但是完全可以设计一个调试器,可以根据预先定义的对象网络(或树)来构建起对目标对象内存的解释。通常在内核调试时,我们也是通过获得一个核心对象后,然后根据其中的地址来获得其引用的其他对象,当然前提是调试者要非常清楚内存中对象的实际关系。

编写自己的linux调试器 编写自己的LinuxDebugger-CodeProject 背景 读者必须具备Linux的基本知识:特别是信号及其处理。调试器依赖于信号从调试器获得通知(例如:SIGTRAP)。调试器总是通过wait功能。 附加代码在Ubuntu14.04,64位(Linux3.16.0-55-泛型)上进行测试。 断点 断点允许用户在正在调试的程序流中放置中断。用户可以这样做来评估执行过程中的某些条件。 调试器添加一条指令:int 3(操作码:0xcc)在正在调试的可执行文件的进程空间中的特定地址(. 阅读详情

相关推荐

C++ 调试器内部工作原理:断点、单步执行与寄存器

下次遇到Bug的时候,不要慌张,拿起你的调试器,像福尔摩斯一样,去寻找真相吧!有了断点,你就可以在程序执行到关键位置的时候,暂停一下,看看变量的值,检查一下程序的执行流程。调试器本质上就是一个程序,它能控制另一个程序的执行,读取它的内存,修改它的状态。好的,各位观众老爷们,今天咱们来聊聊C++调试器这玩意儿的内幕,保证让你听完之后,感觉自己也能撸一个调试器出来。图形化调试器的原理就是在命令行调试器的基础上,提供一个图形化的用户界面。有了单步执行,你就可以像电影里的慢动作回放一样,仔细观察程序的每一步操作。

weixin_41455464的博客 1064

程序调试原理及步骤

在单片机或者程序开发过程中,有一个很重要的步骤就是“调试”又叫“debug”。通过调试能够迅速找到程序出现的问题,用好调试能让我们事半功倍。 “调试”的过程就是在程序段某个可能出现问题的地方打一个“断点”,程序运行到断点之后就会停止运行,之所以叫“断电”,一个可以从它的工作原理上理解,因为打断点实现程序停止的工作机理就叫“中断”,和平时用的外部中断,定时中断都是一样的。另一个还可以直观的理解,因为程序运行到这个点就“断了”,所以叫断点。 那为什么要打断点,或者说打断点的意义在哪里?首先,编写一个大一点的程序

qq_41861711的博客 5800

RuoYi项目适配达梦数据库(二)

RuoYi项目,代码生成模块的达梦数据库适配。

邢慧鹏的博客 1万+

调试基础知识及原理

个可调试的可执行文件。我个人觉得里面的内容可以分为3个部分。 1,机器码。C/C++ 转成的机器码 2,符号表信息(symbols) 3,调试信息(debug info) 无论是 Linux 的GDB,还是 Windows 的 WinDbg 跟 VsDebug,都是根据上面这些信息来进行调试的。...

u012117034的博客 1875

Vast.ai GPU服务器租用与SSH密钥连接实战指南

本文详细介绍了如何在Vast.ai平台租用GPU服务器并通过SSH密钥安全连接的全流程。从注册、选配GPU型号到SSH密钥生成与配置,再到实战中的端口转发和文件传输技巧,帮助用户高效利用云端GPU资源进行深度学习等计算密集型任务。

weixin_29574585的博客 526

线性调频LFM脉冲压缩 连续波雷达仿真&线性调频信号仿真分析压缩matlab程序源码

13、线性调频信号(LFM)压缩感知的稀疏与重构算法(OMP)的matlab仿真程序(一个可以在matlab上运行的压缩感知实例;8、具有多普勒频移的线性调频信号(知道带宽、采样频率、T使用MATLAB仿真线性调频信号即LFM,同时具有多普勒频移时,匹配滤波后的波形变化。19、CW脉冲和LFM信号Matlab仿真(这是matlab仿真程序,实现了常规雷达信号CW和线性调频信号LFM的仿真)18、lfm信号模糊函数图 matlab(用matlab 实现的线性调频信号信号(lfm)的模糊函数图)

2301_77866396的博客 400

调试是什么及其重要性

调试技巧,优秀代码,常见编程错误类型

m0_74270127的博客 3850

深入LSM6DSL的FIFO连续模式:基于STM32和MEMS库的数据流高效处理指南

本文深入探讨了LSM6DSL的FIFO连续模式,结合STM32硬件平台和ST官方MEMS库,提供了高效的数据流处理方案。通过优化I2C通信时序、中断驱动设计以及动态ODR调整,实现低功耗数据采集与处理,显著提升嵌入式传感器应用的性能和续航能力。

weixin_30387799的博客 348

黑客之瞳——调试(二)

调试(二)

cas的无名博客 615

企业微信开发007_域名主体校验未通过,需配置备案主体与当前企业主体相同或有关联关系的域名_企业内部自建应用开发_配置可信域名_回调URL_可信IP---企业微信开发009

因为我这个企业微信是,已经注册了服务商了,所以我又注册了一个不是服务商的测试企业,没有实名认证的,去试了试。而且,网络上找的教程,都是不够详细的,还是会碰到各种各样的问题,记录下来,为后来者提供便利。首先我用natapp.cn 申请了一个免费的域名,然后去,一个,企业微信上去配置,注意。我这个域名,的主体,可能是域名服务商,比如阿里域名 等等的 不是一般的企业域名。我这个企业微信,是开通了服务商的,企业微信,右上角有服务商管理后台的。到时候,直接用,他们自己企业注册的域名,已经备案的再去尝试,

添柴程序猿的专栏 1693

性能优化-高通cDSP(QDSP6)架构详解

高通cDSP开发的商业价值30秒快速认识高通cDSP开发的商业价值【高通cDSP旨在处理一些简单但需要大量计算的场景,如图像处理、科学计算、AI训练、计算机视觉等。这些场景使用CPU来运算会极大的降低CPU的吞吐量,因此利用现代寄存器较宽的特性设计出了适配数据并行的DSP芯片,cDSP就是典型的代表。利用cDSP+CPU既可以满足一般的使用场景,也可以完成现代图像和视频数据的处理。

发狂的小花的博客 5943

嵌入式开发:你对你的调试器有多了解?

调试器可以说是嵌入式软件工程师最重要的工具之一。调试器不仅能够在微控制器上加载固件,还可以窥探内存和寄存器的深度,揭示其内部工作原理。尽管调试器很重要,但许多嵌入式开发人员忽略了调试器的一些最有用的功能,而只是简单地了解调试器可以真正完成什么。...

yueqian_edu的博客 178

【YOLO11改进 - 检测头】Detect_LSCD检测头:量化的检测头,进一步提升模型的检测效率和精度

【YOLO11改进 - 检测头】Detect_LSCD检测头:量化的检测头,进一步提升模型的检测效率和精度

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 4094

GDB调试器:从符号表到二进制逆向,深入理解程序调试的底层原理

本文深入解析GDB调试器的底层原理,从ELF格式的符号表结构到ptrace系统调用的工作机制,详细介绍了断点实现、指令级分析和内存布局等核心调试技术。通过实际案例展示GDB在二进制逆向、多线程调试和核心文件分析中的高级应用,帮助开发者深入理解程序运行机制,提升调试效率。

gold的博客 866

如何调试10G/25G以太网IP自协商/Link Training

如果是40G/50G, 100G以太网,选的是多通道的IP,务必保证两端的通道0是正确对接上的,因为在做自协商的时候,以太网只使用通道0,其它通道需在自协商完成后再加入工作。b. 自协商的工作完全由IP自动完成的,所以只要配置没问题,你只需要耐心等待就可以看到自协商的完成,以an_good_check为标志,并且进入下一步linktraining。c. 在LT的过程中,首先你要等到IP能够锁定LT帧,即frame_lock拉高,然后你就可以进行你自己的LT算法了,与AN不同LT是由客户手动完成的。

qq_43416206的博客 1509

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++调试器实现:从ptrace到断点机制,深入理解程序调试原理

调试是软件开发中定位和修复问题的核心环节,其本质是控制并观察另一个进程的执行状态。在Linux系统中,这一功能主要通过ptrace系统调用实现,它允许父进程跟踪子进程,读写其内存和寄存器。理解调试原理对于系统编程、性能优化和安全研究至关重要,它能帮助开发者从底层排查断点失效、变量被优化等疑难问题。通过实现一个简易的C++调试器类,可以深入掌握软件断点(如INT 3指令替换)、信号处理(SIGTRAP)以及进程间通信等关键技术。这些知识在逆向工程、定制化性能剖析工具等场景中具有重要价值,最终自然引导至如何构建

weixin_33491377的博客 290

VC中sqlite的使用

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

[monitor] 9. Linux ptrace(程序调试器原理)

1、ptrace概念你一定知道linux下大名鼎鼎的程序调试工具gdb,但你可能没有听说过ptrace。Ptrace是linux一个标准系统调用,是gdb实现程序调试的核心。 ptrace能让一个进程实现对另一个进程的调试,主进程可以对被调试进程进行一系列控制动作:可以让被调试进程在进入/退出系统调用时断点,可以对被调试进程的任何位置插入调试断点,可以控制被调试进程单步执行,可以读取/写入被调试进程

pwl999的博客 2806

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【矛与盾】调戏调试器:反断点技术

首先声明,理解本文需要对用户态的调试器原理有所了解,否则可能有些内容会不理解。 先来个测试程序,本文以分析和理解此程序为主。 测试程序下载 无论是逆向分析、还是脱壳破解,都离不开调试器。而windows下面用户态调试器最常用的,那就是OllyDbg了。 现在就用OD载入并调试该程序,如下图所示。 <img class="thumbnail" title="点击图片以查看大图 图片名

a949308398的专栏 1231

python调试器原理_vardbg 一个简单的Python调试器和探查器,可生成程序流程的动画可视化效果,对算法学习很有用...

vardbg A simple Python debugger and profiler that generates animated visualizations of program flow. It is meant to help with learning algorithms by allowing you to visualize what the algorithms are d...

weixin_39558521的博客 376

调试器基本原理

调试器(debugger),是一种用于控制其他程序执行流程、监控和修改其他程序状态的软件工具。调试器通过实时分析程序的执行状态,协助开发者定位代码错误、了解程序工作原理、性能调优及逆向工程等。

itas109的专栏 1406

【Linux】调试器 gdb 及 ‘\r‘ 的使用

在Linux下我们可以通过 gcc 进行编译,但与 vs 相比若想对代码进行调试,我们还需要学会使用调试器 gdb 。我们都知道程序的发布方式有两种,release 版本和 debug 版本,而 release 版本是无法进行调试的,但在Linux gcc/g++出来的二进制程序,默认是release模式,因此需要我们手动调整。

Lin_Alpaca的博客 3228

深入理解python虚拟机:调试器实现原理与源码分析

在本篇文章当中主要给大家介绍 python 语言当中调试器的实现原理,通过了解一个语言的调试器的实现原理我们可以更加深入的理解整个语言的运行机制,可以帮助我们更好的理解程序的执行。

qq_45537774的博客 470

windbg内核调试原理浅析

<br />From:  http://dragonsn.bokee.com/502510.html<br /> <br /> <br />SoBeIt <br /><br />    前段时间忽然对内核调试器实现原来发生了兴趣,于是简单分析了一下当前windows下主流内核调试器原理,并模仿原理自己也写了个极其简单的调试器:) <br /><br />                WinDBG <br />     <br />    WinDBG和用户调试器一点很大不同是内核调试器在一台机器上启动,通

zht_304的专栏 3516

调试器工作原理

以下内容摘抄自:http://blog.jobbole.com/author/%E9%99%88%E8%88%B8/ 一、基础篇:原理(http://blog.jobbole.com/23463/) 本文是一系列探究调试器工作原理的文章的第一篇。我还不确定这个系列需要包括多少篇文章以及它们所涵盖的主题,但我打算从基础知识开始说起。 关于本文 我打算在这篇文章中介绍关于Linux下的调试

foreveryoung001的专栏 1157

调试器工作原理之二——实现断点

英文原文:Eli Bendersky  翻译:伯乐在线— 陈舸 本文是关于调试器工作原理探究系列的第二篇。在开始阅读本文前,请先确保你已经读过本系列的第一篇(基础篇)。 本文的主要内容        这里我将说明调试器中的断点机制是如何实现的。断点机制是调试器的两大主要支柱之一 ——另一个是在被调试进程的内存空间中查看变量的值。我们已经在第一篇文章中稍微涉及到了一些监视被调试进程

GQB的专栏 4439

Windows内核调试器原理浅析(浪子清风)

文摘出处:http://www.xfocus.net/articles/200412/765.html创建时间:2004-12-23文章属性:原创文章提交:SoBeIt (kinsephi_at_hotmail.com)Windows内核调试器原理浅析                                                                          

TingyaBak的专栏 971
上一篇: 51、AVR、PIC、ARM单片机的总线与存储空间的理解
下一篇: ObjectC学习总结
wjgit
博客等级 码龄18年 12粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值