2)硬件断点
硬件断点通过调试寄存器实现,设置在CPU级别上,当需要调试某个指定区域而又无法修改该区域时,硬件断点非常有用。
一个CPU一般会有8 个调试寄存器(DR0 寄存器到DR7寄存器),用于管理硬件断点。其中调试寄存器DR0到调试寄存器DR3存储硬件断点地址,同一时间内最多只能设置4个硬件断点;DR4和DR5保留,DR6是状态寄存器,说明被断点触发的调试事件的类型;DR7本质上是一个硬件断点的开关寄存器,同时也存储了断点的不同类型。通过在DR7寄存器里设置不同标志,能够创建以下几种断点:当特定的地址上有指令执行的时候中断、当特定的地址上有数据写入的时候、当特定的地址上有数据读或者写但不执行的时候。
硬件断点使用“INT 1”实现,该中断负责硬件中断和步进事件。步进是指根据预定的流程一条一条地执行指令,每执行完一条指令后暂停下来,从而可以精确地观察关键代码并监视寄存器和内存数据的变化。在CPU每次执行代码之前,都会先确认当前将要执行代码的地址是否是硬件断点的地址,同时也要确认是否有代码要访问被设置了硬件断点的内存区域。如果任何储存在DR0-DR3中的地址所指向的区域被访问了,就会触发 “INT 1”中断,同时暂停CPU;如果不是中断地址则CPU执行该行代码,到下一行代码时,CPU继续重复上面的过程。
3)内存断点
内存断点是通过修改内存中指定块或页的访问权限来实现的。通过将指定内存块或页的访问权限属性设置为受保护的,则任何不符合访问权限约束的操作都将失败,并抛出异常,导致CPU暂停执行,使得调试器可以查看当前执行状态。
一般来说,每个内存块或页的访问权限都由三种不同的访问权限组成:是否可执行、是否可读、是否可写。每个操作系统都提供了用来查询和修改内存页访问权限的函数,在Windows操作系统中可以使用VirtualProtect()函数来修改主调进程虚拟地址空间中已提交页面的保护属性,使用VirtualProtectEx()函数可以修改其他进程虚拟地址空间页面的保护属性。
16.6 运行本章16.4节中的代码并查看运行结果。 答:略。
第17章 科学计算与可视化
17.1 运行本章所有代码并查看运行结果。 答:略。
17.2 使用Python内置函数dir()查看scipy模块中的对象与方法,并使用Python内置函数help()查看其使用说明。 答:略。