-
-
[讨论]软件调试学习笔记4.1
-
发表于: 2020-1-16 23:42 2709
-
测试使用环境VS 2019
相关词汇
中断 break
断点 breakpoint
落实断点 resolve breakpoint
断点异常 BP breakpoint exception
边界 limit
通用性保护异常GP General Protection Exception
软件中断
实践注入代码手工设置断点
#include <windows.h> #include <cstdlib> int main(int argc, char* argv[]) { // manual breakpoint //_asm INT 3;//默认把_asm INT 3;这句断点指令注释掉 printf("Hello INT 3!\n"); system("pause"); return 0; }
INT 3 指令为断点指令
INT 3 指令的设计目的是中断到调试器
INT 3 指令产生的断点是依靠插入指令和软件中断机制工作的。
INT 3 断点异常属于陷阱类异常,常规当CPU产生异常时,程序指针是指向导致异常的下一条指令。观察汇编窗口发现确是指向导致异常的这条指令,原因是操作系统为了支持调试对程序指针做了调整。
调试器设置断点的步骤:首先对代码中某行设置断点时,(1)调试器会把这里本来指令的第一个字节保存起来,(2)然后写入一条INT 3指令。[ INT 3指令的机器码是11001100b,十六进制0xCC ],仅1字节,设置和取消断点时需要保存恢复一个字节。
扩展知识:断点的设置信息保存在当前目录下的同名.opt文件中。
落实断点:VS 2019一个一个地取出OPT文件中的断点记录(断点所在的文件和行位置),将断点设置到目标代码的内存映像中,将断点位置对应的指令的第一个字节先保存起来,在替换为0xCC。替换是在启动调试时和调试过程中动态进行的。
落实断点过程中可能发生问题:某个断点的位置根本对应不到目标映像的代码段。
测试下图操作,在不调试的情况下直接在代码中添加上_asm INT 3;
CPU在实模式时执行INT 3的过程
当CPU执行INT 3指令的过程就是产生断点异常,并转去执行异常处理例程的过程。在跳转到处理例程之前,CPU会保存当前的执行上下文,包括段寄存器、程序指针寄存器等。
REAL-ADDRESS-MODE: IF((vector_number*4)+3) (* is not within IDT limit 是否在IDT限制之内;检查根据中断向量号计算出向量地址是否超出了中断标的边界,实模式下,中断向量表的每个表项是个字节,分贝处理例程的段(两字节)和偏移地址(两字节)*) THEN #GP;(* 如果超出,产生保护性错误异常 *) FI; IF (* stack not large enough for a 6-byte return information,堆栈不够大,不能返回6字节;检查栈上是否有足够的空间来保存寄存器,当堆栈不足以容纳要压入的6字节的内容时(CS、IP、EFLAGS的低16位),产生堆栈异常#SS *) THEN #SS; FI; Push (EFLAGS[15:0]);(* 清除标志寄存器的IF,TF,AC位 *) IF ← 0; TF ← 0; AC ← 0; Push (CS);(* 当前段的寄存器和程序指针寄存器的内容保存在当前程序的栈 *) Push (IP); (* No error codes are pushed 没有错误代码被推送 *) CS ← IDT (Descriptor (vector_number*4),selector);(* 将注册在中断向量表(IDT)中的异常处理例程的入口地址 *) EIP ← IDT (Descriptor (vector_number*4),offset);(* 16 bit offset ADN 0000FFFFH *) END
扩展知识:为了辅助调试,编译器在编译调试版时会用0xCC来填充刚分配的缓冲区,如果因为缓冲区或堆栈溢出时程序指针意外指向这些区域,会因为遇到INT 3指令而马上中断到调试器。编译器还使用INT 3指令来填充函数或代码段末尾的空闲区域(用于内存对齐)。
软件断点的局限性
1:可以让CPU执行到代码段内的某个地址时停下来,不适用与数据段和I/O空间。
2:对于在ROM只读存储器中执行的程序[ BIOS 或其他固件程序 ],无法动态增加软件断点。目标内存是只读的,无法动态写入断点指令。
3:在中断向量表或中断描述表没有准备好或遭到破话的情况下,这类断点无法或不能正常工作的。常见场景[ 系统刚刚启动时,或中断描述表被病毒篡改 ]。
软件断点的优点:使用方便,没有数量限制
u `hiint3!HiInt3.cpp:11`
硬件断点
陷阱标志
实模式调试器例子解析
未完
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
- 跟帖实践,base64编码中位运算操作分析. 1621
- [原创]深入理解计算机系统第三版P35问题 1656
- 深入理解计算机系统第三版26页问题 2084
- [讨论]设置内核调试环境 2482
- [翻译]持续更新用到的词汇 7063