Python程序设计习题与答案.pdf

上传人:hg158****2095 文档编号:73651859 上传时间:2023-02-21 格式:PDF 页数:44 大小:893.44KB
返回 下载 相关 举报
Python程序设计习题与答案.pdf_第1页
第1页 / 共44页
Python程序设计习题与答案.pdf_第2页
第2页 / 共44页
点击查看更多>>
资源描述

《Python程序设计习题与答案.pdf》由会员分享,可在线阅读,更多相关《Python程序设计习题与答案.pdf(44页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、Python 程序设计习题与参考答案 第 1 章 基础知识 简单说明如何选择正确的 Python 版本;答:在选择 Python 的时候,一定要先考虑清楚自己学习 Python 的目的是什么,打算做哪方面的开发,有哪些扩展库可用,这些扩展库最高反复安装和卸载上;同时还应该注意,当更新的 Python 版本推出之后,不要急于更新,而是应该等确定自己所必须使用的扩展库也推出了较新版本之后再进行更新;尽管如此,Python 3 毕竟是大势所趋,如果您暂时还没想到要做什么行业领域的应用开发,或者仅仅是为了尝试一种新的、好玩的语言,那么请毫不犹豫地选择Python 系列的最高版本目前是 Python;为

2、什么说 Python 采用的是基于值的内存管理模式 答:Python 采用的是基于值的内存管理方式,如果为不同变量赋值相同值,则在内存中只有一份该值,多个变量指向同一块内存地址,例如下面的代码;x=3 idx y=3 idy y=5 idy idx 在 Python 中导入模块中的对象有哪几种方式 答:常用的有三种方式,分别为 import 模块名 as 别名 from 模块名 import 对象名 as 别名 from math import 使用 pip 命令安装 numpy、scipy 模块;答:在命令提示符环境下执行下面的命令:pip install numpy pip install

3、 scipy 编写程序,用户输入一个三位以上的整数,输出其百位以上的数字;例如用户输入 1234,则程序输出 12;提示:使用整除运算;答:x=inputPlease input an integer of more than 3 digits:try:x=intx x=x else:printx except BaseException:printYou must input an integer.import types x=inputPlease input an integer of more than 3 digits:if typex=:print You must input a

4、n integer.elif lenstrx=4:print You must input an integer of more than 3 digits.else:print xoinmapstr,result x=inputPlease input an integer less than 1000:t=x i=2 result=while True:if t=1:break if t%i=0:i t=t/i else:i+=1 print x,=,.joinmapstr,result 编写程序,至少使用 2 种不同的方法计算 100 以内所有奇数的和;x=i for i in rang

5、e1,100 if i%2=1 printsumx printsumrange1,100:2 编写程序,实现分段函数计算,如下表所示;x y x0 0 0=x5 x 5=x10 3x-5 10=x20 20=x 0 x=inputPlease input x:x=evalx if x=20:print0 elif 0=x5:printx elif 5=x10:print3x-5 elif 10=x20:printx-2 第 4 章 字符串与正则表达式 假设有一段英文,其中有单独的字母“I”误写为“i”,请编写程序进行纠正;1 不使用正则表达式 x=i am a teacher,i am man

6、,and i am 38 years am not a businessman.x=i,I x=i,I printx 2 使用正则表达式 x=i am a teacher,i am man,and i am 38 years am not a businessman.import re pattern=r:w|bi:w while True:result=x if result:if 0=0:x=x:0+1+I+x0-1:else:x=x:0+I+x0-1:else:break printx 假设有一段英文,其中有单词中间的字母“i”误写为“I”,请编写程序进行纠正;import re x=I

7、 am a teacher,I am man,and I am 38 years am not a busInessman.printx pattern=r:wI:w while True:result=x if result:if 0=0:x=x:0+1+i+x0-1:else:x=x:0+i+x0-1:else:break printx 有一段英文文本,其中有单词连续重复了2次,编写程序检查重复的单词并只保留一个;例如文本内容为“This is is a desk.”,程序输出为“This is a desk.”1 方法一 import re x=This is a a desk.patt

8、ern=rbw+s+11,b matchResult=x x=1,x printx 2 方法二 x=This is a a desk.pattern=rPbw+bsP=f matchResult=x x=0,1 简单解释 Python 的字符串驻留机制;答:Python 支持字符串驻留机制,即:对于短字符串,将其赋值给多个不同的对象时,内存中只有一个副本,多个对象共享该副本;这一点不适用于长字符串,即长字符串不遵守驻留机制,下面的代码演示了短字符串和长字符串在这方面的区别;a=1234 b=1234 ida=idb True a=123450 b=123450 ida=idb False 编写

9、程序,用户输入一段英文,然后输出这段英文中所有长度为3个字母的单词;import re x=inputPlease input a string:pattern=rba-zA-Z3b printx 第 5 章 函数设计与使用 答:原因是对于函数的默认值参数只会被处理一次,下次再调用函数并且不为默认值参数赋值时会继续使用上一次的结果,对于列表这样的结构,如果调用函数时为默认值参数的列表插入或删除了元素,将会得到保留,从而影响下一次调用;编写函数,判断一个整数是否为素数,并编写主程序调用该函数;import math def IsPrimev:n=intv+1 for i in range2,n:

10、if v%i=0:return No else:return Yes printIsPrime37 printIsPrime60 printIsPrime113 编写函数,接收一个字符串,分别统计大写字母、小写字母、数字、其他字符的个数,并以元组的形式返回结果;def demov:capital=little=digit=other=0 for i in v:if A=i=Z:capital+=1 elif a=i=z:little+=1 elif 0=i def demo:a=3 print a a=5 demo 3 a 5 编写函数,可以接收任意多个整数并输出其中的最大值和所有整数之和;d

11、ef demov:printv printmaxv printsumv demo1,2,3 demo1,2,3,4 demo1,2,3,4,5 编写函数,模拟内置函数 sum;def Sumv:s=0 for i in v:s+=i return s x=1,2,3,4,5 printSumx x=1,2,3,4,5 printSumx 编写函数,模拟内置函数 sorted;def Sortedv:t=v:r=while t:tt=mint tt tt return r x=1,3,5,2,1,0,9,7 printx printSortedx 第 6 章 面向对象程序设计 继承节例2中的Pe

12、rson类生成Student类,填写新的函数用来设置学生专业,然后生成该类对象并显示信息;import types class Personobject:基类必须继承于 object,否则在派生类中将无法使用 super函数 def _init_self,name=,age=20,sex=man:name age sex def setNameself,name:if not isinstancename,str:printname must be string.return =name def setAgeself,age:if not isinstanceage,int:printage

13、must be integer.return =age def setSexself,sex:if sex=man and sex=woman:printsex must be man or woman return =sex def showself:print print print class StudentPerson:def _init_self,name=,age=30,sex=man,major=Computer:调用基类构造方法初始化基类的私有数据成员 superStudent,self._init_name,age,sex major 初始化派生类的数据成员 def setM

14、ajorself,major:if not isinstancemajor,str:printmajor must be a string.return =major def showself:superStudent,self.show print if _name_=_main_:zhangsan=PersonZhang San,19,man lisi=StudentLi Si,32,man,Math 设计一个三维向量类,并实现向量的加法、减法以及向量与标量的乘法和除法运算;class Vecter3:def _init_self,x=0,y=0,z=0:=x =y =z def _add

15、_self,n:r=Vecter3 =+=+=+return r def _sub_self,n:r=Vecter3 =-=-=-return r def _mul_self,n:r=Vecter3 =n =n =n return r def _truediv_self,n:r=Vecter3 =/n =/n =/n return r def _floordiv_self,n:r=Vecter3 =类名_xxx”这样的特殊方式来访问;Python 中没有纯粹的 C+意义上的私有成员;与 运 算 符“”对 应 的 特 殊 方 法 名 为 _pow_ ,与 运 算 符“.except.else.语

16、句;3 在实际开发中,同一段代码可能会抛出多个异常,需要针对不同的异常类型进行相应的处理;为了支持多个异常的捕捉和处理,Python提供了带有多个except的异常处理结构,这类似于多分支选择结构,一旦某个 except 捕获了异常,则后面剩余的 except 子句将不会再执行;语法为:try:try 块 被监控的语句 except Exception1:except 块 1 处理异常 1 的语句 except Exception2:except 块 2 处理异常 2 的语句 4 将要捕获的异常写在一个元组中,可以使用一个 except 语句捕获多个异常,并且共用同一段异常处理代码,当然,除非

17、确定要捕获的多个异常可以使用同一段代码来处理,并不建议这样做;5 最后一种常用的异常处理结构是 try.except.finally.结构;在该结构中,finally 子句中的内存无论是否发生异常都会执行,常用来做一些清理工作以释放 try 子句中申请的资源;语法如下:try:finally:.无论如何都会执行的代码 异常和错误有什么区别 答:异常是指因为程序执行过程中出错而在正常控制流以外采取的行为;严格来说,语法错误和逻辑错误不属于异常,但有些语法错误往往会导致异常,例如由于大小写拼写错误而访问不存在的对象,或者试图访问不存在的文件,等等;使用 pdb 模块进行 Python 程序调试主要

18、有哪几种用法 答:主要有三种方式,1 在交互模式下使用 pdb 模块提供的功能可以直接调试语句块、表达式、函数等多种脚本;2 在程序中嵌入断点来实现调试功能 在程序中首先导入 pdb 模块,然后使用在需要的位置设置断点;如果程序中存在通过该方法调用显式插入的断点,那么在命令提示符环境下执行该程序或双击执行程序时将自动打开 pdb 调试环境,即使该程序当前不处于调试状态;3 使用命令行调试程序 在命令行提示符下执行“python m pdb 脚本文件名”,则直接进入调试环境;当调试结束或程序正常结束以后,pdb 将重启该程序;Python 内建异常类的基类是 BaseException ;断言语

19、句的语法为 assert ;Python 上下文管理语句是 with ;第 9 章 GUI 编程 设计一个窗体,并放置一个按钮,单击按钮后弹出颜色对话框,关闭颜色对话框后提示选中的颜色;import wx class wxGUI:def OnInitself:frame=parent=None,title=wxGUI,size=160,140 panel=frame,-1 buttonOK=panel,-1,OK,pos=0,0 ,buttonOK return True def OnButtonOKself,event:colorDlg=None color=.Colour strcolor

20、 app=wxGUI 设计一个窗体,并放置一个按钮,按钮默认文本为“开始”,单击按钮后文本变为“结束”,再次单击后变为“开始”,循环切换;import wx class wxGUI:def OnInitself:frame=parent=None,title=wxGUI,size=160,140 panel=frame,-1 =panel,-1,Start,pos=0,0 ,return True def OnButtonOKself,event:if text=Start:elif text=End:app=wxGUI 设计一个窗体,模拟登录界面,当用户输入号码 123456 和密码 654

21、321 时提示正确,否则提示错误;import wx class wxGUI:def OnInitself:frame=parent=None,title=Login,size=250,150,pos=350,350 panel=frame,-1 label1=panel,-1,UserName:,pos=0,10,style=label2=panel,-1,Password:,pos=0,30,style=panel,-1,pos=70,10,size=160,20 =panel,-1,pos=70,30,size=160,20,style=buttonOK=panel,-1,OK,pos=

22、30,60 ,buttonOK buttonCancel=panel,-1,Cancel,pos=120,60 ,buttonCancel return True def OnButtonOKself,event:if usrName=123456 and usrPwd=654321:Right else:Wrong def OnButtonCancelself,event:pass app=wxGUI 第 10 章 网络程序设计 简单解释 TCP 和 UDP 协议的区别;答:TCP 协议是面向连接的、具有质量保证的可靠传输协议,但开销较大;UDP 协议是尽最大能力传输的无连接协议,开销小,常

23、用于视频在线点播 Video On Demand,VOD 之类的应用;TCP 协议和 UDP 协议并没有优劣之分,仅仅是适用场合有所不同;同学之间合作编写UDP通信程序,分别编写发送端和接收端代码,发送端发送一个字符串“Hello world”;假设接收端在计算机的 5000 端口进行接收,并显示接收内容;答:首先使用 ipconfig/all 命令查看本机 IP 地址,然后分别编写下面的代码,并将其中的 IP 地址替换为相应的 IP 地址;接收端代码:import socket s=,5000 空字符串表示本机任何可用 IP 地址 data,addr=1024 缓冲区大小为 1024 字节

24、print received message:%s%data 显示接收到的内容 发送端代码:import socket s=,0 主机的 IP 地址 简单介绍 socket 模块中用于 TCP 编程的常用方法;TCP 一般用于要求可靠数据传输的场合;编写 TCP 程序时经常需要用到的socket模块方法主要有:connectaddress:连接远程计算机 sendbytes,flags:发送数据 recvbufsize,flags:接收数据 bindaddress:绑定地址 listenbacklog:开始监听,等待客户端连接 accept:响应客户端的请求 编写代码读取搜狐网页首页内容;答:

25、import dir dirfp print100 在自己的机器上配置 IIS 以支持 Python 脚本的运行,然后使用 Python 编写脚本,运行后在网页上显示“Hello world”;答:核心代码为 print print Status:200 OK print Content-type:text/html print print Python Sample CGI print print This is a header print Hello world print print 第 11 章 大数据处理 简单介绍常见的大数据处理框架;答:主要有三种,MapReduce:分布式计算

26、框架,可以将单个大型计算作业分配给多台计算机执行,可以在短时间内完成大量工作,尤其适合数值型和标称型数据,但需要对行业领域具有一定理解后重写算法来完成特定的业务处理要求;MapReduce 的名字由函数式编程中常用的 map 和 reduce 两个单词组成;MapReduce 在大量节点组成的集群上运行,工作流程是:单个作业被分成很多小份,输入数据也被切片并分发到每个节点,每个节点只在本地数据上做运算,对应的运算代码称为mapper,这个过程即 map 阶段;每个 mapper 的输出通过某种方式组合,根据需要可能再进行重新排序,排序后的结果再被切分成小份并分发到各个节点进行下一步处理,这个过

27、程被称为 reduce 阶段,对应的代码称为 reducer;不同类型的作业可能需要不同数量的 reducer,并且,在任何时候,每个 mapper或reducer 之间都不进行通信,每个节点只负责处理自己的事务,并且只在分配到本地的数据集上进行运算;Hadoop:Hadoop 是 MapReduce 框架的一个免费开源实现,采用 Java 语言编写,支持在大量机器上分布式处理数据;除了分布式计算之外,Hadoop 还自带分布式文件系统,可以在上面运行多种不同语言编写的分布式程序;Hadoop 在可伸缩性、健壮性、计算性能和成本上具有无可替代的优势,事实上已成为当前互联网企业主流的大数据分析平

28、台;Spark:Spark 是一个针对超大数据集合的低延迟集群分布式计算系统,比MapReduce 快 40 倍左右;Spark 是 Hadoop 的升级版本,兼容 Hadoop 的 API,能够读写Hadoop的HDFS HBASE 顺序文件等,与之不同的是将结果保存在内存中;Hadoop作为第一代产品使用了HDFS,第二代加入了Cache来保存中间计算结果,第三代则是 Spark 倡导的流技术 Streaming;运行本章中代码并理解 MapReduce 编程思路;答:略 第 12 章 Windows 系统编程 查阅相关资料,解释注册表几大根键的用途;答:略 选择一个编写好的 Python

29、 程序,将其转换为 exe 可执行文件;答:略,请参考书中相关介绍;编写代码,使用至少 3 中不同的方法启动 Windows 自带的计算器程序;答:第一种方法:import os 第二种方法:import os 第三种方法:import os 第四种方法:import win32api 0,open,1 第五种方法:import win32process handle=rc:windowssystem32,None,None,0,None,None,编写代码,检测您所使用的操作系统版本;答:略,请参考节;第 13 章 多线程编程 简单叙述创建线程的方法;答:Thread 类支持使用两种方法来创

30、建线程,一种是为构造函数传递一个可调用对象,另一种是继承 Thread 类并在派生类中重写_init_和 run 方法;创建了线程对象以后,可以调用其 start 方法来启动,该方法自动调用该类对象的 run 方法,此时该线程处于 alive 状态,直至线程的 run 方法运行结束;简单叙述 Thread 对象的方法;答:1jointimeout:阻塞当前线程,等待被调线程结束或超时后再继续执行当前线程的后续代码,参数 timeout 用来指定最长等待时间,单位为秒;2isAlive:测试线程是否处于运行状态 3start:自动调用 run 方法,启动线程,执行线程代码;4run:线程代码,用

31、来实现线程的功能与业务逻辑,可以在子类中重写该方法来自定义线程的行为;简单叙述线程对象的 daemon 属性的作用和影响;答:在脚本运行过程中有一个主线程,若在主线程中创建了子线程,当主线程结束时根据子线程 daemon 属性值的不同可能会发生下面的两种情况之一:1 当某子线程的 daemon 属性为 False 时,主线程结束时会检测该子线程是否结束,如果该子线程尚未完成,则主线程会等待它完成后再退出;2 当某子线程的 daemon属性为 True时,主线程运行结束时不对该子线程进行检查而直接退出,同时所有 daemon 值为True的子线程将随主线程一起结束,而不论是否运行完成;daemo

32、n属性的值默认为False,如果需要修改,则必须在调用 start 方法启动线程之前进行修改;解释至少 3 种线程同步方法;答:(1)使用 Condition 对象可以在某些事件触发后才处理数据,可以用于不同线程之间的通信或通知,以实现更高级别的同步;Condition对象除了具有acquire和 release 方法之外,还有 wait、notify、notify_all 等方法;下面通过经典生产者/消费者问题来演示 Condition 对象的用法;(2)Queue模块在 Python 3 中为 queue 模块实现了多生产者/多消费者队列,尤其适合需要在多个线程之间进行信息交换的场合,该模

33、块的Queue对象实现了多线程编程所需要的所有锁语义;(3)Event 对象是一种简单的线程通信技术,一个线程设置 Event 对象,另一个线程等待 Event 对象;Event 对象的 set 方法可以设置 Event 对象内部的信号标志为真;clear 方法可以清除 Event 对象内部的信号标志,将其设置为假;isSet方法用来判断其内部信号标志的状态;wait 方法只有在其内部信号状态为真时将很快地执行并返回,若 Event 对象的内部信号标志为假,wait 方法将一直等待至超时或内部信号状态为真;第 14 章 数据库编程 简单介绍 SQLite 数据库;答:SQLite 是内嵌在 P

34、ython 中的轻量级、基于磁盘文件的数据库管理系统,不需要服务器进程,支持使用 SQL 语句来访问数据库;该数据库使用 C 语言开发,支持大多数 SQL91 标准,支持原子的、一致的、独立的和持久的事务,不支持外键限制;通过数据库级的独占性和共享锁定来实现独立事务,当多个线程同时访问同一个数据库并试图写入数据时,每一时刻只有一个线程可以写入数据;SQLite 支持 2TB大小的单个数据库,每个数据库完全存储在单个磁盘文件中,以 B+树数据结构的形式存储,一个数据库就是一个文件,通过简单复制即可实现数据库的备份;使用 Python 内置函数 dir 查看 Cursor 对象中的方法,并使用内置

35、函数 help查看其用法;答:略;叙述使用 Python 操作 Access 数据库的步骤;答:1 建立数据库连接 import DSN 2 打开记录集 rs_name=MyRecordset 表名 +rs_name+,conn,1,3 3 操作记录集 4 操作数据 sql_statement=Insert INTO Table_Name Field_1,Field_2 VALUES data1,data2 DSN sql_statement 5 遍历记录 count=0 while 1:if:break else:count=count+1 叙述使用 Python 操作 MS SQL Ser

36、ver 数据库的步骤;答:可以使用 pywin32 和 pymssql 两种不同的方式来访问 MS SQL Server 数据库;先来了解一下 pywin32 模块访问 MS SQL Server 数据库的步骤;1 添加引用:import adodbapi import as adc 2 创建连接:Cfg=constr=rProvider=;Initial Catalog=%s;Data Source=%s;user ID=%s;Password=%s;%Cfgdb,Cfgserver,sa,Cfgpassword conn=constr 3 执行 sql 语句:cur=sql=select

37、from softextBook where title=0 and remark3=1.formatbookName,flag sql data=4 执行存储过程:假设 proName 有三个参数,最后一个参数传了 null ret=procName,parm1,parm2,None 5 关闭连接 接下来再通过一个示例来简单了解一下使用 pymssql 模块访问 MS SQL Server数据库的方法;import pymssql conn=host=SQL01,user=user,password=password,database=mydatabase cur=CREATE TABLE

38、personsid INT,name VARCHAR100 INSERT INTO persons VALUES%d,1,John Doe,2,Jane Doe SELECT FROM persons WHERE salesrep=,John Doe row=while row:print ID=%d,Name=%row0,row1 row=SELECT FROM persons WHERE salesrep LIKE J%叙述 MySQLDb 模块提供的数据库访问方法;答:Python 访问 MySQL 数据库可以使用 MySQLDb 模块,该模块主要方法有:commit:提交事务;roll

39、back:回滚事务;callprocself,procname,args:用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数;executeself,query,args:执行单条 sql 语句,接收的参数为 sql 语句本身和使用的参数列表,返回值为受影响的行数;executemanyself,query,args:执行单条 sql 语句,但是重复执行参数列表里的参数,返回值为受影响的行数;nextsetself:移动到下一个结果集;fetchallself:接收全部的返回结果行;fetchmanyself,size=None:接收 size 条返回结果行,如果 siz

40、e 的值大于返回的结果行的数量,则会返回条数据;fetchoneself:返回一条结果行;scrollself,value,mode=relative:移 动 指 针 到 某 一 行,如 果mode=relative,则表示从当前所在行移动 value 条;如果 mode=absolute,则表示从结果集的第一行移动 value 条;第 15 章 多媒体编程 编程程序,在窗口上绘制一个三角形,设置三个顶点为不同的颜色,并对内部进行光滑着色;答:from import from import from import import sys class MyPyOpenGLTest:def _ini

41、t_self,width=640,height=480,title=MyPyOpenGLTest:glutInit glutInitDisplayModeGLUT_RGBA|GLUT_DOUBLE|GLUT_DEPTH glutInitWindowSizewidth,height =glutCreateWindowtitle glutDisplayFunc glutIdleFunc width,height default drawing function def Drawself:glClearGL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT glLoadIde

42、ntity glTranslatef,draw 2D graphic,leaving z to be 0 glBeginGL_POLYGON glColor3f,glVertex3f,glColor3f,glVertex3f,glColor3f,glVertex3f,glEnd glTranslatef,glutSwapBuffers def InitGLself,width,height:glClearColor,glClearDepth glDepthFuncGL_LESS glShadeModelGL_SMOOTH glEnableGL_POINT_SMOOTH glEnableGL_L

43、INE_SMOOTH glEnableGL_POLYGON_SMOOTH glMatrixModeGL_PROJECTION glHintGL_POINT_SMOOTH_HINT,GL_NICEST glHintGL_LINE_SMOOTH_HINT,GL_NICEST glHintGL_POLYGON_SMOOTH_HINT,GL_FASTEST glLoadIdentity gluPerspective,floatwidth/floatheight,glMatrixModeGL_MODELVIEW def MainLoopself:glutMainLoop if _name_=_main_

44、:w=MyPyOpenGLTest 编写程序,读取两幅大小一样的图片,然后将两幅图像的内容叠加到一幅图像,结果图像中每个像素值为原两幅图像对应位置像素值的平均值;答:from PIL import Image im1=d:im2=d:size=for i in rangesize0:for j in rangesize1:color1=i,j color2=i,j r=color10+color20p3 total=lenmusics while:nextMusic=musics print playing.,nextMusic else:1 def OnButtonOKself,event:

45、=True create a new thread to play music t=target=def OnButtonCancelself,event:=False app=wxGUI 运行本章中的代码并查看运行结果;答:略;第 16 章 逆向工程与软件分析 下载 PE 文件规范版本,并尝试了解 PE 文件基本结构;答:略;下载并安装 IDA Pro 与 Immunity Debugger,并简单了解 PE 文件反汇编和调试步骤;答:略;安装并配置 IDAPython 插件,然后运行本章 答:略;在 Immunity Debugger 调试器中运行本章 答:略;叙述软件调试断点的概念、作用

46、及其分类;答:断点是最常用的软件调试技术之一,其基本思想是在某一个位置设置一个“陷阱”,当 CPU 执行到这个位置的时候停止被调试的程序并中断到调试器中,让调试者进行分析和调试,调试者分析结束后,可以让被调试程序恢复执行;通过设置断点可以暂停程序执行,并可以观察和记录指令信息、变量值、堆栈参数和内存数据,还可以深入了解和把握程序执行的内部原理和详细过程,断点对于软件调试具有重要的意义和作用;断点可以分为软件断点、硬件断点和内存断点三大类;1 软件断点 软件断点是一个单字节指令 INT 3,字节码为 0 xCC,可以在程序中设置多个软件断点,使得程序执行到该处时能够暂停执行,并将控制权转移给调试

47、器的断点处理函数;当调试器被告知在目标地址设置一个断点,它首先读取目标地址的第一个字节的操作码,然后保存起来,同时把地址存储在内部的中断列表中;接着,调试器把一个字节操作码“0 xCC”写入刚才的地址;当 CPU 执行到“0 xCC”操作码的时候就会触发一个“INT 3”中断事件,此时调试器就能捕捉到这个事件;调试器继续判断这个发生中断事件的地址通过指令指针寄存器 EIP 是不是自己先前设置断点的地址;如果在调试器内部的断点列表中找到了这个地址,就将设置断点前存储起来的操作码写回到目标地址,这样进程被调试器恢复后就能正常的执行;2 硬件断点 硬件断点通过调试寄存器实现,设置在 CPU 级别上,

48、当需要调试某个指定区域而又无法修改该区域时,硬件断点非常有用;一个 CPU 一般会有 8 个调试寄存器 DR0 寄存器到 DR7 寄存器,用于管理硬件断点;其中调试寄存器 DR0 到调试寄存器 DR3 存储硬件断点地址,同一时间内最多只能设置 4 个硬件断点;DR4 和 DR5 保留,DR6 是状态寄存器,说明被断点触发的调试事件的类型;DR7 本质上是一个硬件断点的开关寄存器,同时也存储了断点的不同类型;通过在 DR7 寄存器里设置不同标志,能够创建以下几种断点:当特定的地址上有指令执行的时候中断、当特定的地址上有数据写入的时候、当特定的地址上有数据读或者写但不执行的时候;硬件断点使用“IN

49、T 1”实现,该中断负责硬件中断和步进事件;步进是指根据预定的流程一条一条地执行指令,每执行完一条指令后暂停下来,从而可以精确地观察关键代码并监视寄存器和内存数据的变化;在 CPU 每次执行代码之前,都会先确认当前将要执行代码的地址是否是硬件断点的地址,同时也要确认是否有代码要访问被设置了硬件断点的内存区域;如果任何储存在DR0-DR3中的地址所指向的区域被访问了,就会触发“INT 1”中断,同时暂停 CPU;如果不是中断地址则 CPU执行该行代码,到下一行代码时,CPU 继续重复上面的过程;3 内存断点 内存断点是通过修改内存中指定块或页的访问权限来实现的;通过将指定内存块或页的访问权限属性

50、设置为受保护的,则任何不符合访问权限约束的操作都将失败,并抛出异常,导致 CPU 暂停执行,使得调试器可以查看当前执行状态;一般来说,每个内存块或页的访问权限都由三种不同的访问权限组成:是否可执行、是否可读、是否可写;每个操作系统都提供了用来查询和修改内存页访问权限的函数,在 Windows 操作系统中可以使用 VirtualProtect 函数来修改主调进程虚拟地址空间中已提交页面的保护属性,使用 VirtualProtectEx 函数可以修改其他进程虚拟地址空间页面的保护属性;运行本章节中的代码并查看运行结果;答:略;第 17 章 科学计算与可视化 运行本章所有代码并查看运行结果;答:略;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 工作报告

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com