DEBUG 使用教程 查错 排错 debug 模式 大全
- 格式:doc
- 大小:41.00 KB
- 文档页数:11
debug使用详解首先,向大家推荐使用DR-DOS7所带的DR-DEBUG,指令支持到Pemtium pro,功能强大,且支持宏。
最方便的是可以用回车代替上一条u/d/p/t指令,方便察看和调试。
下面把其帮助翻译如下:汇编,把输入的汇编语言转成机器码A [address] (example: Acs:100)设置中断点以调试B [address] [count] [condition] (example: B100 2 al=80)比较两段内存内容Compare C range address (example: C200 20d 500)显示指定内存数据Dump D [range] (example: Dcs:500 L 10)编辑内存数据Enter E [address] [data] (example: Eds:500 "Hello ")填充内存Fill F range data (example: F100 13f "Test ")运行程序从指定点Go G [=address] [breakpoints] (example: Gcs:4bb0)计算Hex H [value1] [value2] (example: H10e 01)从I/O埠输入Input I port (example: I3f2)载入文件或指定逻辑扇区内容Load L [address] [drive] [firstsec] [number] (ex: L0Cff 3 09 10)移动(复制)内存内容Move M range address (example: Mcs:200 220 cs:400)指定操作文件名Name N [drive:] [path] filename (example: )向I/O埠输出Output O port value (example: O3ff 10)单步执行(跳过int/rep/call等)Proceed P [=address] [number] (example: P=ds:3fff)退出debugQuit Q更改或显示寄存器Register R [register_name] (example: Rax 1000)搜索数据于指定内存Search S range data (example: Sds:200 500 32)单步执行(进入int/rep/call等)Trace T [=address] [number] (example: T=3cff:0100 10)反汇编指定内存中机器码Unassemble U [range] (example: U3cff:0200 400)显示屏幕内容(相当于<F4>)Viewswap V (any key returns)写入文件或指定逻辑扇区内容Write W [address] [drive] [firstsec] [number] (ex: Wds:200 0 16 0f) (range 可以是: 开始[段:]偏移结束偏移或开始地址 L 长度)以下是详细使用说明:--- 术语表 ---pathname - 文件名(路径可选)testparms - 参数address - 内存地址[段:]偏移如果省略段地址,以CS用作汇编\反汇编;DS用于其他功能range - 可以是: 开始[段:]偏移结束偏移开始地址 L 长度开始地址, +长度reg - 寄存器名list - 由空格或逗号分开的一些数值(给定类型的)drive - 0 = A:, 1 = B:, ...firstsec - 逻辑扇区号(以0开始)--- 运算符号 ---数可以是16进制(默认的), #十进制, \八进制, %二进制, '字符串'("chars"), 寄存器, [绝对地址], ^堆栈。
五、DEBUG调试程序DEBUG.EXE程序是专门为分析、研制和开发汇编语言程序而设计的一种调试工具,具有跟踪程序执行、观察中间运行结果、显示和修改寄存器或存储单元内容等多种功能。
它能使程序设计人员或用户触及到机器内部,因此可以说它是80X86CPU的心灵窗口,也是我们学习汇编语言必须掌握的调试工具。
1)DEBUG程序使用在DOS提示符下键入命令:C>DEBUG [盘符:][路径][文件名.EXE][参数1][参数2]这时屏幕上出现DEBUG的提示符“-”,表示系统在DEBUG管理之下,此时可以用DEBUG 进行程序调试。
若所有选项省略,仅把DEBUG装入内存,可对当前内存中的内容进行调试,或者再用N和L命令,从指定盘上装入要调试的程序;若命令行中有文件名,则DOS把DEBUG 程序调入内存后,再由DEBUG将指定的文件名装入内存。
2)DEBUG的常用命令(1)汇编命令A格式:A[起始地址]功能:将输入源程序的指令汇编成目标代码并从指定地址单元开始存放。
若缺省起始地址,则从当前CS:100地址开始存放。
A命令按行汇编,主要是用于小段程序的汇编或对目标程序的修改。
(2)反汇编命令U格式1:U[起始地址]格式2:U[起始地址][结束地址|字节数]功能:格式1从指定起始地址处开始将32个字节的目标代码转换成汇编指令形式,缺省起始地址,则从当前地址CS:IP开始。
格式2将指定范围的内存单元中的目标代码转换成汇编指令。
(3)显示、修改寄存器命令R格式:R[寄存器名]功能:若给出寄存器名,则显示该寄存器的内容并可进行修改。
缺省寄存器名,则按以下格式显示所有寄存器的内容及当前值(不能修改)。
AX=0000 BX=0004 CX=0020 DX=0000 SP=0080 BP=0000 SI=0000DI=0000 DS=3000 ES=23A0 CS=138E IP=0000NV UP DI PL NZ NA PO NC138E:0000 MOV AX,1234-R AX ;输入命令AX 0014 ;显示AX的内容:;供修改,不修改按回车。
2.3 DEBUG使用方法简介:DEBUG是DOS命令,必须在DOS环境下运行。
由于目前都使用WINDOWS操作系统,应设法进入实地址模式的DOS环境,才能可靠地运行DEBUG。
一般可用DOS启动盘启动系统,或在WINDOWS-98系统退出时选择“切换到MSDOS”操作,进入到实地址模式的DOS环境。
由于DEBUG是DOS外部命令,因此,须把DEBUG.EXE文件拷贝到当前目录下来运行DEBUG,DOS启动盘中应事先拷贝有DEBUG.EXE文件,在WINDOWS98系统中,“C:\WINDOWS\COMMAND\”目录下有DEBUG.EXE文件。
后面的操作,假设DEBUG.EXE文件都已事先拷贝到当前目录下。
在WINDOWS操作系统中(包括WINDOWS98、2K、XP等),系统提供了V86模式的“命令提示符”窗口,在此窗口中也能运行DEBUG,但DEBUG的某些功能会受到WINDOWS系统的限制。
1.启动与退出DEBUG:启动DEBUG,在DOS提示符下输入:DEBUG[回车]屏幕显示“-”,表示已启动了DEBUG。
“-”是DEBUG子命令等待状态,后面所有的DEBUG操作(包括运行调试自编的汇编语言程序)都是在此“-”提示符下所进行的DEBUG 子命令执行。
退出DEBUG,在“-”提示符下输入:Q[回车]屏幕显示DOS命令提示符:C:\> 或A:\> 。
2.进入与退出输入汇编指令:在“-”提示符下输入:A [偏移地址] [回车]屏幕显示“<段地址>:<偏移地址> |”,此处将等待你输入汇编语言程序或实验指令。
当一条指令输入完毕[回车]后,又将自动出现下一对“<段地址>:<偏移地址> |”等待你输入下条指令,如此重复,将帮助你把整段汇编语言程序输入完毕。
注意:如果输入汇编指令时手误,屏幕上将当场提示错误“ERROE”,自动地址不进步,还在原地址上等待你重新输入正确的汇编指令。
debug命令DEBUG命令参数详解DEBUG是一个DOS实用程序,是供程序员使用的程序调试工具,可以用它检查内存中任何地方的字节以及修改任何地方的字节。
它可以用于逐指令执行某个程序以验证程序运行的正确性,也可以追踪执行过程、比较一个指令执行前后的值以及比较与移动内存中数据的范围,读写文件与磁盘扇区。
它的功能包括以下几个方面。
1,直接输入,更改,跟踪,运行汇编语言源程序;2,观察操作系统的内容;3,查看ROM BIOS的内容;4,观察更改RAM内部的设置值;5,以扇区或文件的方式读写软盘数据DEBUG把所有数据都作为字节序列处理。
因此它可以读任何类型的文件。
DEB UG可以识别两种数据: 十六进制数据和ASCⅡ码字符。
它的显示格式是各个字节的十六进制值以及值在32与126之间的字节的相应ASCⅡ码字符。
在DEBUG中输入数据有两种方法: 提示方法和非提示方法。
在用提示方法时,用户可以输入要求输入数据的命令,后跟数据所要输入的地址。
然后用户就可以看到该地之中已有内容及一个冒号提示符。
此时用户可以在提示符下输入一个新的值或者按下回车键或CTRL+C回到短横(-)提示符。
在运用非提示方法时,用户可以输入要输入数据的内存地址以及要输入的字节。
但与使用字处理程序或正文编辑程序时不一样,在使用DEBUG时,用户不能直接移动光标到一入口点输入或修改数据,而要一次输入一个或几个字节。
在使用DEBUG时可以只涉及内存中的数据,从而一般都要指定所要处理的内存地址,地址的输入格式是: [段地址]: [位移]。
如果没有输入地址,DEBUG将假定为当前内存段,从位于地址100H的字节开始。
前100H字节保留给程序段前缀使用,这一专用区域用于建立DOS与程序之间的联系。
DEBUG总是用四位十六进制数表示地址。
用两位数表示十六进制数据。
讲到这里大家应该对DEBUG有了初步的了解,但是光知道这些可不够,接下来我来讲讲DEBUG的命令格式和命令。
DEBUG使用方法DEBUG使用方法格式:DEBUG[[drive:][path]filename[testfile-para meters]]参数:[drive:][path]filename指定待调试可执行文件的所在位置及文件名。
testfile-parameters指定待设计可执行文件需要的命令参数。
相关命令-A (汇编,Assemble)-C (比较,Compare)-D (卸出,Dump)-E (输入数据,Enter))-F (填充,Fill)-G (执行,Go)-H (十六进行运算,Hex)-I (读输入口,Input)的所在位置及名子,DEBUG执行时将显示符(-)。
这时,用户可输入任何一个DEBUG调试命令。
DEBUG命令以下为DEBUG使用的调试命令及其简介:?显示所有的调试命令A汇编8086/8087/8088汇编语言源程序。
C比较两块内存的内容。
D显示部分内存的内容。
E人指定的地址开始把数据送入内存。
F将指一值填进某一范围的内存。
G运行内存中的程序。
H执行十六进制算术运算。
I从指定输入口输入一道字节值。
L把文件或磁盘扇区内容装入内存。
M拷贝某块内存的内容。
N指定文件名,以便L或W命令读写该文件;指定正调试文件所需的参数。
O发送一字节值至指定输出口。
P执行循环程序,重复字符串指令,软中断,或子程序。
Q结束DEBUG命令执行。
R显示或修改一个或数个寄存器内容。
S在内存指定范围内找寻指定的值。
T执行一条指令,然后显示所有寄存器的内容,所有标志状态,以及下一条要执行的指令(汇编语言格式)。
U反汇编某一范围内的字节,显示其相应汇编语言源语名。
W把正调试文件写入磁盘。
XA分配扩充内存XD释放分配的扩充内存。
XM作扩充内存页的影像。
XS显示扩充内存的状态。
命令参数间的隔离除命令Q外,所有的调试命令都可使用参数。
参数间可用逗号或空格隔开,但只是在十六进制数之间才要求必须隔开。
因此,下列命令是等价的:dcs: 100 110D CS: 100 110D,CS:100,110指定有效地址调试命令中的addres(地址)参数指定内存中的地址。
Debug是一种程序调试工具,主要用于帮助程序员检查和修复程序中的错误。
以下是如何使用Debug的基本步骤:
设置断点:断点是一种标记,告诉Debug从标记的地方开始查看。
在要设置断点的代码行上单击鼠标左键即可。
运行程序:在代码区域右击,选择Debug执行。
单步执行:点击Step Into(F7)这个箭头,或者直接按F7,以一行一行地操纵代码,从而判断程序的执行流程是否与预期一致。
查看变量值:在执行过程中,可以查看变量的当前值,以了解程序状态。
删除或禁用断点:选择要删除的断点,单击鼠标左键即可。
如果是多个断点,可以每一个再点击一次。
也可以一次性全部删除。
以上是使用Debug的基本步骤,但请注意,具体使用方式可能会根据Debug的具体版本和配置有所不同。
1.项目报错,即eclipse里面项目工程有红叉eclipse中打开Problems视图,window->show view->other->General->Problems通过Problems视图中的错误信息,找到错误源(有可能是java文件,或者(xml,有可能是 1.xml有错;2.含有错误字符(比如从word复制过来);3.假报)buildpath -> eclipse中工程,右键->Build Path-> Configure Build path -> Libraries选项卡察看JRE System Library(引入jdk自带包0),Server Runtime(引入jsp/servlet实现包,比如Apache Tomcat V6.0(这个是window->preferences->server下定义的Runtime Environment对应))Web App Libraries(包含了eclipse中项目工程自带的WEB-INF/lib 下引入的jar包)junit(调试用,不一定需要)User Library(一般eclipse使用者把自己引入的jar包放在一起,定义一个library,在eclipse中引用)2.项目启动,控制台报错察看控制台错误信息可能错误信息包括:1.session factory(可能是hibernate的实体类定义错误), 控制台一般看到dao,sessionFactory,hibernate的关键字eg.Caused by: org.hibernate.PropertyNotFoundException: Could not find a getter for name1 in class demo.ssh2.model.Roleatorg.hibernate.property.BasicPropertyAccessor.createGetter(BasicProperty Accessor.java:306)atorg.hibernate.property.BasicPropertyAccessor.getGetter(BasicPropertyAc cessor.java:299)atorg.hibernate.mapping.Property.getGetter(Property.java:294)atorg.hibernate.tuple.entity.PojoEntityTuplizer.buildPropertyGetter(PojoEnt ityTuplizer.java:300)atorg.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTu plizer.java:141)atorg.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.ja va:78)... 55 more2.bean定义错误,dao,service,action,1.<property name="" ref=""/>中的ref找不到对应的bean的id从sessionfactory->dao->service->action,前面的错误总能导致出后面的错误eg.比如定义了如下spring配置信息<bean id="sessionFactory" ..../><bean id="baseDao" abstract="true" class="demo.ssh2.dao.BaseHibernateDao"><property name="sessionFactory" ref="sessionFactory1" /></bean>控制台报错org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDao' defined in file...(备注:此处省略多少字)Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'sessionFactory1' is definedatorg.springframework.beans.factory.support.DefaultListableBeanFactory.g etBeanDefinition(DefaultListableBeanFactory.java:527)atorg.springframework.beans.factory.support.AbstractBeanFactory.getMerg edLocalBeanDefinition(AbstractBeanFactory.java:1083)atorg.springframework.beans.factory.support.AbstractBeanFactory.doGetB ean(AbstractBeanFactory.java:274)atorg.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:190)atorg.springframework.beans.factory.support.BeanDefinitionValueResolver .resolveReference(BeanDefinitionValueResolver.java:322)... 30 more2.setter方法名和spring配置文件中的<property name="" ref=""/>中的name 不匹配eg.比如定义如下:<bean id="roleService" class="demo.ssh2.service.RoleService"><property name="roleDao" ref="roleDao"/></bean>RoleService中roleDao的setter方法如下public void setRoleDao1(RoleDao roleDao) {this.roleDao = roleDao;}方法setRoleDao1和<property name="roleDao" 不匹配控制台报错:Caused by: org.springframework.beans.NotWritablePropertyException:Invalid property 'roleDao' of bean class[demo.ssh2.service.RoleService]:Bean property 'roleDao' is not writable or has an invalid setter method.Did you mean 'roleDao1'?atorg.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWr apperImpl.java:1024)atorg.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWr apperImpl.java:900)atorg.springframework.beans.AbstractPropertyAccessor.setPropertyValues( AbstractPropertyAccessor.java:76)atorg.springframework.beans.AbstractPropertyAccessor.setPropertyValues( AbstractPropertyAccessor.java:58)atorg.springframework.beans.factory.support.AbstractAutowireCapableBea nFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.jav a:1358)... 28 more3.缺少setter方法比如配置<bean id="roleService" class="demo.ssh2.service.RoleService"><property name="roleDao" ref="roleDao"/></bean>在类RoleService中没有定义roleDao的setter方法控制台报错:Caused by: org.springframework.beans.NotWritablePropertyException:Invalid property 'roleDao' of bean class [demo.ssh2.service.RoleService]:Bean property 'roleDao' is not writable or has an invalid setter method.Does the parameter type of the setter match the return type of the getter?atorg.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWr apperImpl.java:1024)atorg.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWr apperImpl.java:900)atorg.springframework.beans.AbstractPropertyAccessor.setPropertyValues( AbstractPropertyAccessor.java:76)atorg.springframework.beans.AbstractPropertyAccessor.setPropertyValues( AbstractPropertyAccessor.java:58)atorg.springframework.beans.factory.support.AbstractAutowireCapableBea nFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.jav a:1358)... 28 more3.eclipse缓存问题,更改了文件,部署到web server中的文件仍然旧的servers视图中,先停止server,然后删除servereclipse中点击项目工程,Project->clean->最上面选中Clean Projects selected below->点击ok3.项目运行,控制台报错察看控制台错误信息可能错误信息包括:1.jdbc配置错误(数据库url,用户名,密码)比如jdbc配置文件错误,将ername=root修改为ername=root1页面报错如下:org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Cannot open connection 控制台报错如下:2013-11-20 09:39:25,441 [org.hibernate.util.JDBCExceptionReporter]-[ERROR] Cannot create PoolableConnectionFactory (Access denied for user 'root1'@'localhost' (using password: YES))2.页面访问不到404或页面有异常信息根据访问的url里面的action,找到Action类对应的方法,打个断点(打在方法体内的代码块的第一行)如果不能进入debug视图,表示struts.xml配置文件有问题,页面输入url中的action找不到对应的Action类eg.比如将strus.xml配置名为<action name="role/list",页面访问role/list1.acito页面报错:ng.NoSuchMethodException:demo.ssh2.action.RoleAction.list1()ng.Class.getMethod(Class.java:1605)如果能进入debug视图,表示struts.xml配置文件没有问题,1.一般控制台会有异常栈错误信息eg.比如RoleAction有如下方法public String list(){List<?> list = roleService.getList();ActionContext.getContext().put("roles", list);return "list";}RoleService中getList方法如下public List<?> getList(){throw new RuntimeException();}页面报错:ng.RuntimeExceptiondemo.ssh2.service.RoleService.getList(RoleService.java:13)2.struts2标签或jstl标签使用错误3.页面不能显示出数据,1.action中私有实体类属性没有gettter/setter方法,或者没有使用request.setAttribute,或者使用ActionContext.getContext().put,传值2.struts2标签或jstl标签使用不对,但页面不报错。
DEBUG程序的使用一、在DOS的提示符下,可如下键入Debug启动调试程序:DEBUG [路径\文件名] [参数1] [参数2]Debug后可以不带文件名,仅运行Debug程序;需要时,再用N和L命令调入被调试程序。
命令中可以带有被调试程序的文件名,则运行Debug的同时,还将指定的程序调入主存;参数1/2是被调试程序所需要的参数。
在Debug程序调入后,根据有无被调试程序及其类型相应设置寄存器组的内容,发出Debug的提示符“-”,此时就可用Debug命令来调试程序。
•运行Debug程序时,如果不带被调试程序,则所有段寄存器值相等,都指向当前可用的主存段;除SP之外的通用寄存器都设置为0,而SP指示当前堆栈顶在这个段的尾部;IP=0100h;状态标志都是清0状态。
•运行Debug程序时,如果带入的被调试程序扩展名不是.EXE,则BX.CX包含被调试文件大小的字节数(BX为高16位),其他同不带被调试程序的情况。
•运行Debug程序时,如果带入的被调试程序扩展名是.EXE,则需要重新定位。
此时,CS : IP和SS : SP根据被调试程序确定,分别指向代码段和堆栈段。
DS=ES指向当前可用的主存段,BX.CX包含被调试文件大小的字节数(BX为高16位),其他通用寄存器为0,状态标志都是清0状态。
二、DEBUG命令的格式Debug的命令都是一个字母,后跟一个或多个参数:字母 [参数]命令的使用中注意:①字母不分大小写;②只使用16进制数,没有后缀字母;③分隔符(空格或逗号)只在两个数值之间是必须的,命令和参数间可无分隔符;④每个命令只有按了回车键后才有效,可以用Ctrl+Break中止命令的执行;⑤命令如果不符合Debug的规则,则将以“error”提示,并用“^”指示错误位置。
许多命令的参数是主存逻辑地址,形式是“段基地址 : 偏移地址”。
其中,段基地址可以是段寄存器或数值;偏移地址是数值。
如果不输入段地址,则采用默认值,可以是缺省段寄存器值。
DEBUG命令使用解析及范例大全启动Debug,它是可用于测试和调试MS-DOS 可执行文件的程序。
Debug [[drive:][path] filename [parameters]]参数[drive:][path] filename指定要测试的可执行文件的位置和名称。
parameters指定要测试的可执行文件所需要的任何命令行信息。
说明使用Debug 命令但不指定要测试的文件如果使用没有位置和文件名的Debug 命令,然后键入所有的Debug 命令以响应Debug 提示符,连字符(-)。
Debug 命令以下是Debug 命令列表:? 显示Debug 命令列表。
a 汇编8086/8087/8088 记忆码。
c 比较内存的两个部分。
d 显示部分内存的内容。
e 从指定地址开始,将数据输入到内存。
f 使用指定值填充一段内存。
g 运行在内存中的可执行文件。
h 执行十六进制运算。
i 显示来自特定端口的 1 字节值。
l 将文件或磁盘扇区内容加载到内存。
m 复制内存块中的内容/n 为l 或w 命令指定文件,或者指定正在测试的文件的参数。
o 向输出端口发送 1 个字节的值。
p 执行循环、重复的字符串指令、软件中断或子例程。
q 停止Debug 会话。
r 显示或改变一个或多个寄存器。
s 在部分内存中搜索一个或多个字节值的模式。
t 执行一条指令,然后显示所有寄存器的内容、所有标志的状态和Debug 下一步要执行的指令的解码形式。
u 反汇编字节并显示相应的原语句。
w 将被测试文件写入磁盘。
xa 分配扩展内存。
xd 释放扩展内存。
xm 映射扩展内存页。
xs 显示扩展内存的状态。
分隔命令参数所有Debug 命令都接受参数,除了q 命令之外。
可以用逗号或空格分隔参数,但是只有在两个十六进制值之间才需要这些分隔符。
因此,以下命令等价:dcs:100 110d cs:100 110d,cs:100,110指定有效地址项Debug 命令中的address 参数指定内存位置。
DEBUG的使用方法1.设置断点:断点是在代码中设置的一个位置,程序在运行到这个位置时会暂停执行。
可以在关键的代码行上设置断点,以便在程序运行到这些位置时进行观察和调试。
在DEBUG工具中,我们可以在代码行上单击左侧的空白区域来设置断点。
2.执行步进:步进是一种按步执行程序的方法,可以逐行或逐过程执行代码。
通过逐行执行代码,可以观察每一行代码的执行情况,以便找出程序中的错误。
可以使用DEBUG工具提供的步进功能,一次执行一行代码或一个过程。
3.观察变量:在程序运行过程中,可以观察和监视变量的值,以便了解程序的状态。
可以使用DEBUG工具来查看变量的值,并在程序执行过程中跟踪变量的变化。
这对于发现变量值的改变和问题的根源非常有帮助。
4.输出调试信息:在调试过程中,可以通过在代码中插入输出语句来输出调试信息。
可以使用DEBUG工具提供的输出窗口或控制台来查看这些调试信息。
输出调试信息有助于了解程序的执行流程,找到错误发生的原因。
5.检查堆栈:堆栈是保存程序执行状态的一种数据结构,可以在DEBUG工具中查看和跟踪堆栈的状态。
堆栈信息可以告诉我们程序的执行路径,以及代码是如何调用和返回的。
通过检查堆栈,我们可以找到错误发生的上下文和调用链。
6.使用断言:断言是一种在代码中插入的条件,用于检查程序执行过程中的假设和要求。
可以使用DEBUG工具中的断言功能,在关键的代码位置插入断言条件。
当断言条件不满足时,程序会执行中断操作,从而帮助我们快速定位错误。
7.进行追踪:追踪是一种记录程序执行过程的方法,可以在DEBUG工具中查看程序的执行轨迹。
追踪记录了程序的每一步操作,包括函数调用、条件语句的执行和变量的修改等。
通过追踪,我们可以逐步了解程序的执行情况,并找到错误所在。
8.使用条件断点:条件断点是一种在特定条件下触发断点的方法。
可以在DEBUG工具中设置条件断点,当满足特定条件时,程序会在断点处暂停执行。
条件断点可以帮助我们找出特定情况下的错误,提高调试的效率。
1.项目报错,即eclipse里面项目工程有红叉eclipse中打开Problems视图,window->show view->other->General->Problems通过Problems视图中的错误信息,找到错误源(有可能是java文件,或者(xml,有可能是 1.xml有错;2.含有错误字符(比如从word复制过来);3.假报)buildpath -> eclipse中工程,右键->Build Path-> Configure Build path -> Libraries选项卡察看JRE System Library(引入jdk自带包0),Server Runtime(引入jsp/servlet实现包,比如Apache Tomcat V6.0(这个是window->preferences->server下定义的Runtime Environment对应))Web App Libraries(包含了eclipse中项目工程自带的WEB-INF/lib 下引入的jar包)junit(调试用,不一定需要)User Library(一般eclipse使用者把自己引入的jar包放在一起,定义一个library,在eclipse中引用)2.项目启动,控制台报错察看控制台错误信息可能错误信息包括:1.session factory(可能是hibernate的实体类定义错误), 控制台一般看到dao,sessionFactory,hibernate的关键字eg.Caused by: org.hibernate.PropertyNotFoundException: Could not find a getter for name1 in class demo.ssh2.model.Roleatorg.hibernate.property.BasicPropertyAccessor.createGetter(BasicProperty Accessor.java:306)atorg.hibernate.property.BasicPropertyAccessor.getGetter(BasicPropertyAc cessor.java:299)atorg.hibernate.mapping.Property.getGetter(Property.java:294)atorg.hibernate.tuple.entity.PojoEntityTuplizer.buildPropertyGetter(PojoEnt ityTuplizer.java:300)atorg.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTu plizer.java:141)atorg.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.ja va:78)... 55 more2.bean定义错误,dao,service,action,1.<property name="" ref=""/>中的ref找不到对应的bean的id从sessionfactory->dao->service->action,前面的错误总能导致出后面的错误eg.比如定义了如下spring配置信息<bean id="sessionFactory" ..../><bean id="baseDao" abstract="true" class="demo.ssh2.dao.BaseHibernateDao"><property name="sessionFactory" ref="sessionFactory1" /></bean>控制台报错org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDao' defined in file...(备注:此处省略多少字)Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'sessionFactory1' is definedatorg.springframework.beans.factory.support.DefaultListableBeanFactory.g etBeanDefinition(DefaultListableBeanFactory.java:527)atorg.springframework.beans.factory.support.AbstractBeanFactory.getMerg edLocalBeanDefinition(AbstractBeanFactory.java:1083)atorg.springframework.beans.factory.support.AbstractBeanFactory.doGetB ean(AbstractBeanFactory.java:274)atorg.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:190)atorg.springframework.beans.factory.support.BeanDefinitionValueResolver .resolveReference(BeanDefinitionValueResolver.java:322)... 30 more2.setter方法名和spring配置文件中的<property name="" ref=""/>中的name 不匹配eg.比如定义如下:<bean id="roleService" class="demo.ssh2.service.RoleService"><property name="roleDao" ref="roleDao"/></bean>RoleService中roleDao的setter方法如下public void setRoleDao1(RoleDao roleDao) {this.roleDao = roleDao;}方法setRoleDao1和<property name="roleDao" 不匹配控制台报错:Caused by: org.springframework.beans.NotWritablePropertyException:Invalid property 'roleDao' of bean class[demo.ssh2.service.RoleService]:Bean property 'roleDao' is not writable or has an invalid setter method.Did you mean 'roleDao1'?atorg.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWr apperImpl.java:1024)atorg.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWr apperImpl.java:900)atorg.springframework.beans.AbstractPropertyAccessor.setPropertyValues( AbstractPropertyAccessor.java:76)atorg.springframework.beans.AbstractPropertyAccessor.setPropertyValues( AbstractPropertyAccessor.java:58)atorg.springframework.beans.factory.support.AbstractAutowireCapableBea nFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.jav a:1358)... 28 more3.缺少setter方法比如配置<bean id="roleService" class="demo.ssh2.service.RoleService"><property name="roleDao" ref="roleDao"/></bean>在类RoleService中没有定义roleDao的setter方法控制台报错:Caused by: org.springframework.beans.NotWritablePropertyException:Invalid property 'roleDao' of bean class [demo.ssh2.service.RoleService]:Bean property 'roleDao' is not writable or has an invalid setter method.Does the parameter type of the setter match the return type of the getter?atorg.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWr apperImpl.java:1024)atorg.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWr apperImpl.java:900)atorg.springframework.beans.AbstractPropertyAccessor.setPropertyValues( AbstractPropertyAccessor.java:76)atorg.springframework.beans.AbstractPropertyAccessor.setPropertyValues( AbstractPropertyAccessor.java:58)atorg.springframework.beans.factory.support.AbstractAutowireCapableBea nFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.jav a:1358)... 28 more3.eclipse缓存问题,更改了文件,部署到web server中的文件仍然旧的servers视图中,先停止server,然后删除servereclipse中点击项目工程,Project->clean->最上面选中Clean Projects selected below->点击ok3.项目运行,控制台报错察看控制台错误信息可能错误信息包括:1.jdbc配置错误(数据库url,用户名,密码)比如jdbc配置文件错误,将ername=root修改为ername=root1页面报错如下:org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Cannot open connection 控制台报错如下:2013-11-20 09:39:25,441 [org.hibernate.util.JDBCExceptionReporter]-[ERROR] Cannot create PoolableConnectionFactory (Access denied for user 'root1'@'localhost' (using password: YES))2.页面访问不到404或页面有异常信息根据访问的url里面的action,找到Action类对应的方法,打个断点(打在方法体内的代码块的第一行)如果不能进入debug视图,表示struts.xml配置文件有问题,页面输入url中的action找不到对应的Action类eg.比如将strus.xml配置名为<action name="role/list",页面访问role/list1.acito页面报错:ng.NoSuchMethodException:demo.ssh2.action.RoleAction.list1()ng.Class.getMethod(Class.java:1605)如果能进入debug视图,表示struts.xml配置文件没有问题,1.一般控制台会有异常栈错误信息eg.比如RoleAction有如下方法public String list(){List<?> list = roleService.getList();ActionContext.getContext().put("roles", list);return "list";}RoleService中getList方法如下public List<?> getList(){throw new RuntimeException();}页面报错:ng.RuntimeExceptiondemo.ssh2.service.RoleService.getList(RoleService.java:13)2.struts2标签或jstl标签使用错误3.页面不能显示出数据,1.action中私有实体类属性没有gettter/setter方法,或者没有使用request.setAttribute,或者使用ActionContext.getContext().put,传值2.struts2标签或jstl标签使用不对,但页面不报错。