java调试技术

java调试技术
java调试技术

JAVA调试技术

前言

这份材料介绍JAVA的调试技术,范围涵盖普通程序和服务器端程序的调试。

很多程序员并没有认识到排除软件的错误的价值,如果你是一个JAVA开发者,就很值得读一读这个材料。在现代工具的帮助下,开发者成为一个好的调试者和成为一个好的程序员的重要性一样。

这个材料假设你已经有基本的JAVA编程的知识,如果你精通JAVA,这个材料也可以增加你很多知识。

如果你有其他语言的调试经验,你可以跳过基本知识部分。

即使是高级程序员开发的小程序也可能包含错误。你只需要理解调试的概念并熟悉合适的工具就可以成为好的调试者。这份材料将讲解JAVA调试的基本概念,也讨论高级的调试类型。我们将浏览不同的技术并且提供一些好的建议去帮助避免,追踪并最终修正程序的错误。

我们将通过一个调试范例以使你熟悉调试技术。我们也将使用开发源代码工具Jikes 和JDB向你演示如何调试服务器端和客户端程序。为了编译和运行范例代码,你需要先安装一个Java Development Kit (JDK) ,你可以参考后面的部分获得Jikes 和JDB调试器。

关于作者

如果对这个材料的内容有任何问题,你可以联系作者Laura Bennett, lbenn@https://www.360docs.net/doc/6a2226769.html,。

如果对中文版的翻译有何意见和建议,请联系翻译者cherami ,cherami@https://www.360docs.net/doc/6a2226769.html,。

Laura Bennett 是IBM的资深软件工程师。她获得Pace大学的计算机科学学士学位和Columbia大学的计算机科学硕士学位。她是developerWorks的JAVA传教士,同时也是站

点的建设者。在他的空余时间,她喜欢和她的Lego MindStorm 机器人玩乐以及和她四岁大的TinkerToys搭建物体。

Cherami是一个软件工程师,闲暇之余翻译一些计算机文献,以期为中国的计算机软件事业做出一点微薄的贡献。

调试的基础知识

开始的情况

在JAVA语言的早期,一个典型的开发者使用非常陈旧的方法调试程序:使用

System.out.println()方法。代码的跟踪信息被打印到控制台、文件或者套接字。

很少有人能在第一次就写出完美的(没有任何错误)代码。因此,市场认识到了对于像C++ 程序员使用的调试器那样的工具的需要。Java开发者现在有很多调试工具可以选择,选择什么样的工具依赖于你的技术等级。通常新手使用GUI调试工具而有更多经验的程序员趋向于避免使用所见即所得的工具而更关心有更多的控制能力。没有哪个开发者不使用任何调试工具。调试器允许你穿越代码,冻结输出以及检查变量。开发者越有经验,调试工具越可以帮助他更快定位程序问题的位置。

Java调试器的类型

这里有几种Java调试技术的工具:

?IDE(集成开发环境)包含它们自己的调试器(例如IBM的VisualAge for Java, Symantec Visual Café以及Borland JBuilder)

?单独的GUI工具(例如Jikes, Java 平台调试器javadt, 以及JProbe)

?基于文本和命令行的工具(例如Sun JDB)

?野蛮的使用编辑器(例如Notepad 或者VI) 检查堆栈描绘(stack traces)

你使用的JDK, JSDI, JSP, 和HTML对你的选择都有影响。

IDE 和独立的GUI 调试器对于初学者是最容易的并且被证明是最节省时间的。调试器将引导你到程序崩溃的地方。在调试器里面执行程序,使用鼠标设置断点并穿越代码。使用这些调试器的不利方面是并非所有的IDE调试器都支持最新的Java API和技术(例如servlets 和EJB 组件)。

基于文本和野蛮的使用编辑器的技术提供更多的控制但是对于没有太多经验的程序员可能会花费更长的时间找出错误。我们称它们为“可怜人的”调试方法。

如果上面的都不满足你的需求,Java平台引入Java Debugging APIs使你可以创建符合你自己特定需求的调试器。

调试类型

这儿有很多调试方法,无论是在客户端还是服务器端。我们在这个材料里面包含下面的方法:

?基本的Java字节码(也就是使用System.out.println())

?使用注释

?附加在一个正在运行的程序上

?远程调试

?需求调试(Debugging on demand)

?优化代码的调试

?Servlet, JSP 文件以及EJB 组件的调试

在后面会详细说明每一种类型的调试。

共同的错误类型

为了给你一个你将遇到什么的提示,我们在下面列出了开发者一次又一次遇到的普遍错误:

?编辑或句法错误是你最先和最容易遇到的错误。它们通常是键入错误引起的。

?逻辑错误不同于运行时错误,因为没有任何异常被抛出,但是输出不是期望的东西。

这些错误的范围从缓冲区溢出到内存泄漏。

?运行时错误在程序执行时发生并且通常产生一个Java异常。

?线程错误是最难重复和跟踪的。

Java debugging APIs

Sun已经定义了调试的结构,它们称之为JBUG。这是为了回应对真正的Java调试器的需要做出的。这些APIs帮助程序员建立符合自己需要的调试器:

?接口应该和语言的风格一样是面向对象的。

?例如线程和监视器这样的Java运行时特性应该被前面的支持。

?可以进行远程调试。

?在通常操作下的安全性不能被损害。

修正的Java Debugger (JDB) 既是体现Java Debugging API的概念,同时又是一个有用的调试工具。它用Java Debug Interface (JDI)重写并且是JDK的一部分。JDB将在后面详细讨论。

准备一个调试用的程序

Java平台为调试过程提供语言支持。

你在用编译器编译你的程序时可以用编译选项指示编译器在目标文件中产生符号信息。如果你使用其它的编译器而不是javac,参考你的编译器的文档获得如何生成带有调试信息的目标文件。

如果你使用javac编译器创建调试代码,使用-g编译选项。这个选项让你在调试的时候可以检查本机类实例和静态变量。如果你没有使用该选项生成你的类文件你也可以设置断点和追踪代码,但是你将不能检查变量。(断点是手工指定的程序运行停止的点。)

即使你使用-g选项编译你的程序也不能调试JAVA平台的核心系统类的局部变量。如果你需要列出某些系统类的局部变量的列表,你需要使用-g选项编译这些类,也就是使用-g选项重新编

译rt.jar的类或者是src.zip里面的文件。然后指定你的classpath 为正确的类文件使你用新编译的类运行你的程序。在Java 2下,使用boot classpath选项使得新类被首先加载。

记住如果你使用-O选项优化你的代码,你就不能调试你的类。优化会将所有的调试信息从类中去掉。

注意: 检查你的CLASSPATH 环境变量是正确的才能让调试器和Java 程序知道在哪儿寻找你的类库。你也应该检查你的调试工具看是否需要其它的什么或者是环境变量。

设置断点

调试的第一步就是找到代码出错的位置。断点设置能帮你完成这个。

断点是你你放置在程序里面的临时标记,它使得调试器知道在哪儿停止程序的执行。例如,如果程序里面的某个申明引发问题,你可以将断点设置在包含那个申明的行上,然后运行程序。在那个申明被执行前程序停止执行。然后你可以检查变量、寄存器,存储器以及堆栈的内容,然后跨过(或执行)那个申明查看问题是怎么引起的。

不同的调试器支持不同的断点。一些通用的类型是:

?行断点在程序特定行的代码被执行前被引发。

?方法断点在到达被设置成断点的方法时被引发。

?计数断点在某个计数器达到或超过某个特定值时被引发

?异常断点在代码抛出一个特定异常时被引发

?储存变化断点在存储在特定地址范围的内容被修改时引发

?地址断点在被设置成断点的地址达到时被引发

注意: 一些调试器只在编译版本的Java代码(使用just-in-time 编译器生成的代码) 上支持某些断点类型而不支持解释代码(使用javac工具生成的代码)。一个例子就是地址断点。每个工具在你能设置断点的方式上可能有些不同。检查你的工具的文档。

你可能会问,我如何知道在哪儿放置断点?

?如果你对这个问题完全没有感觉,你可以在main()方法的开始设置断点

?如果你的代码产生堆栈复写(stack trace), 在程序产生它的地方设置断点。你将在堆栈复写里面看到源代码中出问题的行号。

?如果你的输出或者图形显示的特定部分没有正确的显示预定信息(例如文本域显示错误的文本),你可以在该组件被创建的地方设置断点。然后你可以单步执行你的程序显示和GUI对象相关的值。

经验将在最合适的地方设置断点。你在一个类或者程序里面可以设置多个断点。

通常,你在调试代码的时候会禁止、激活、添加、删除断点。工具会允许你查看你所设置的所有断点的位置同时给你一次删除所有断点的选项。

单步执行程序

单步执行程序是最终解决那些棘手的调试问题的方法。它允许你追踪类里面的方法体的整个执行过程。注意,你不需要设置断点就可以停止一个GUI程序的执行。

设置断点后在调试器里面开始执行程序,当遇到第一个断点后,你可以越过申明,进入方法体或类体,也可以继续运行直到下一个断点或程序结束。

在调试程序的时候经常遇到的术语有:

?进入执行当前行。如果当前行包含一个方法调用,执行被调用方法的第一行。如果类中的方法是用不带调试信息的选项编译的(也就是没有使用-g选项), 你将看到No

Source Available消息。

?越过执行当前行而不会因为该行调用了一个方法或例程而停止。

?返回从当前执行点执行并立即返回到调用当前方法的行。

检查变量

通常,程序会因为一个变量的值没有正确设置而进行核心转储(core dump)。最常见的是试图进行一个值为null 的计算或比较以及除零。找出这种问题的最简单的办法是在错误发生的地方检查变量的值。最通常的情况是变量在那点没有得到预期分配的值。

可视化调试器通常有一个监视窗口显示你当前正在执行的类的所有局部变量的值。某些调试器甚至显示变量的地址或更进一步的允许你动态的改变变量的值以查看如果值是你原来预想的情况时程序是否能继续执行。命令行调试器通常提供命令提供相应的特性。使用命令行特性,你甚至可以通过显示数组的每一行和每一列的内容来查看整个数组。

虽然大多调试器只在监视窗口显示类里面的局部变量,还是有一些调试器允许你在变量超出范围后继续监视它。

一些调试器支持查看寄存器。注意这只能是查看编译的Java 程序而不能是解释的程序(字节码程序)。

堆栈复写(Stack traces)

当Java 程序进行内核转储(core dumps)时它在控制台产生我们称之为堆栈复写(stack trace)的东西。堆栈复写告诉开发者程序发生问题的精确路径。它将说明类和方法名以及源代码中的行数(如果你使用调试选项编译)。如果你在发生堆栈复写的开始处开始调试并停下,你可以向后查看你的代码看看实际上是什么申明被执行了。这是一个快速发现程序问题的办法。

你也可以使用下面的一个方法手动强制产生堆栈复写。

?Throwable().printStackTrace()在调用该方法的那个点产生堆栈复写。复写将显示方法调用所涉及到的线程。

?Thread.currentThread.dumpStack()只产生当前线程的一个快照。

当你需要理解在什么条件下你的程序会产生堆栈复写时使用强制复写。下面的程序是一个强制堆栈复写的例子。这个程序片断进行文件拷贝。我们通过比较两个文件的长度是否相等来判断拷贝是否成功。如果不相等,我们向文件写入复写然后强制打印堆栈复写(参看黑体的申明)。

Throwable()是https://www.360docs.net/doc/6a2226769.html,ng中的一个类,printStackTrace()是Throwable()的一个方法,它打印程序执行路径的复写。

public static boolean copyFile( String sourceFile, String targetFile)

{

........

........

// see if the copy succeeded.

if (success)

{

// see if the correct number of bytes were copied

long newFileLength = new File(targetFile).length();

if (oldFileLength != newFileLength)

{

Debug.trace(1, sourceFile + Constants.BLANK_STRING +

Long.toString(oldFileLength));

Debug.trace(1, targetFile + Constants.BLANK_STRING +

Long.toString(newFileLength));

Throwable().printStackTrace();

return false;

}

}

else

{

Debug.trace(1, sourceFile);

Debug.trace(1, targetFile);

return false;

}

........

........

return true;

}

你可能会发现堆栈复写中没有行号。这可以简单的称为“编译代码”,要产生行号,使用nojit 选项或者 https://www.360docs.net/doc/6a2226769.html,piler=NONE命令行参数禁止JIT 编译器。如果你知道了方法和改方法所属类的名字,行号就不那么重要了。

诊断方法

Java 语言在Runtime()类中提供方法跟踪你对JVM的方法调用。这些跟踪将产生你对JVM 字节码的每一个方法调用的列表。注意这个列表可以产生大量的输出,所以在你的代码的小部分里面使用。

打开跟踪可以在代码中加入下面的行:

traceMethodCalls(true)

关闭使用:

traceMethodCalls(false)

打开JVM 并观察它向标准输出的输出。

作者Blog:https://www.360docs.net/doc/6a2226769.html,/cherami/

相关文章

Apache和Tomcat结合使用入门

Java网络加载协议(JNLP)及Java Web Start

错误修订:SCJP认证套题解析之二第40题

字节码如何防止内存错误及提高代码质量

sun在线教材之-java 2d 文本指南-第二课绘制艺术字

C程序调试步骤to初学者

调试程序一般应经过以下几个步骤: 1、先进行人工检查,即静态检查。 在写好一个程序以后,不要匆匆忙忙上机,而应对纸面上的程序进行人工检查。这一步是十分重要的,它能发现程序设计人员由于疏忽而造成的多数错误。而这一步骤往往容易被人忽视。有人总希望把一切推给计算机系统去做,但这样就会多占用机器时间,作为一个程序人员应当养成严谨的科学作风,每一步都要严格把关,不把问题留给后面的程序。 为了更有效地进行人工检查,所编的程序应注意力求做到以下几点: (1)应当采用结构化程序方法编程,以增加可读性;(2)尽可能多加注释,以帮助理解每段程序的作用;(3)在编写复杂的程序时不要将全部语句都写在main函数中,而要多利用函数,用一个函数来实现一个单独的功能。这样既易于阅读也便于调试,各函数之间除用参数传递数据这一渠道以外,数据间尽量少出现耦合关系,便于分别检查和处理。 2、在人工检查无误后,才可以上机调试。通过上机发现错误称动态检查。在编译时给出语法错误的信息,可以根据提示的信息具体找出程序中出错之处并改正之。 应当注意的是有时提示的出错并不是真正出错的行,如果在提示出错的行上找不到错误的话应当到上一行再找。有时提示出错的类型并非绝对准确,由于出错的情况繁多各种错误互有关联,因止要善于分析,找出真正的错误,而不要只从字面意义上找出错信息,钻牛角尖。如果系统提示的出错信息多,应当从上到下一一改正。有时显示出一大片出错信息往往使人感到问题严重,无从下手。其实可能只有一二个错误。例如,对使用的变量未定义,编译时就会对所有含该变量的语句发出出错信息;有的是少了“}”或多了“}”有的是书写语句时忘记写“;”或是全角的“;”了,只要加上一个变量定义,或填加“};”就所有错误都消除了。 3、在改正语法错误后,程序经过连接就得到可执行的目标程序。运行程序,输入程序所需数据,就可得到运行结果。应当对运行结果作分析,看它是否符合要求。 有的初学者看到运行结果就认为没问题了,不作认真分析,这是危险的。 有时,数据比较复杂,难以立即判断结果是否正确。可以事先考虑好一批“试验数据”,输入这些数据可以得出容易判断正确与否的结果。可以在计算的输出结果的程序地方加入一段输出到屏幕窗口的程序,利用屏幕窗口可以方便看到结果的,很直观。例如,if语句有两个分支,有可能在流程经过其中一个分支时结果正确,而经过其它一个分支时结果不对等。必须考虑周全。 事实上,当程序复杂时很难把所有的可能方案全部都试到,选择典型的情况作试验即可。 4、运行结果不对,大多属于逻辑错误。对这类错误往往需要仔细检查和分析才能发现。可以采用以下办法: (1)将程序与流程图仔细对照,如果流程图是正确的话,程序写错了,是很容易发现的。例如,复合语句忘记写花括弧,只要一对照流程图就能很快发现。 (2)如果实在找不到错误,可以采用“分段检查”的方法。在程序不同的位置设几个printf 函数语句,输出有关变量的值,往下检查。直到找到在哪一段中数据不对为止。这时就已经把错误局限在这一段中了。不断减小“查错区”,就可能发现错误所在。 (3)也可以用“条件编译”命令进行程序调试(在程序调试阶段,若干printf函数语句就要进行编译并执行。当调试完毕,这些语句不要再编译了,也不再被执行了)。这种方法可以不必一一去printf函数语句,以提高效率。 5、如果在程序中没有发现问题,就要检查流程图有无错误,即算法有无问题,如有则改正

浙大JAVA 实验题答案05answer1

实验5 分支结构程序的设计 1.程序填空题,不要改变与输入输出有关的语句。 20004 计算旅途时间 输入2个整数time1和time2,表示火车的出发时间和到达时间,计算并输出旅途时间。 有效的时间范围是0000到2359,不需要考虑出发时间晚于到达时间的情况。 例:括号内是说明 输入 712 1411(出发时间是7:12,到达时间是14:11) 输出 The train journey time is 6 hrs 59 mins. import java.util.Scanner; public class Test20004 { public static void main(String[] args) { Scanner in=new Scanner(System.in); int time1, time2, hours, mins; time1=in.nextInt(); time2=in.nextInt(); /*------------------*/ /*计算两个时间之间的小时数和分钟数*/ hours=time2/100-time1/100; mins=time2%100-time1%100; /*当计算得到的分钟数为负数时进行调整*/ hours=mins>0?hours:hours-1; mins=mins>0?mins:mins+60; //或:if(mins<0){hours-=1;mins+=60;} System.out.println("The train journey time is "+hours+" hrs "+ mins+" mins."); } } 30001 显示两级成绩 输入一个正整数repeat (0

Java_2实用教程第4版_第12章_Java多线程机制

2014/1/20 第 1 页 注意:开始用功了! 1 2014/1/20 第 2 页 《Java2实用教程(第4版)》第12章 配合例子源代码一起使用 Power point 制作:耿祥义张跃平 Java多线程机制 2 2014/1/20 第 3 页 导读 主要内容 Java中的线程 Thread类与线程的创建 线程的常用方法 线程同步 协调同步的线程 线程联合 GUI线程 计时器线程 3 2014/1/20 第 4 页 §12.1 进程与线程 §12.1.1 操作系统与进程 程序是一段静态的代码,它是应用软件执行的蓝本。 进程是程序的一次动态执行过程,它对应了从代码加载、执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展至消亡的过程。 现代操作系统可以同时管理一个计算机系统中的多个进程,即可以让计算机系统中的多个进程轮流使用CPU资源。 4 2014/1/20 第 5 页 §12.1.2 进程与线程 线程是比进程更小的执行单位,一个进程在其执行过程中,可以产生多个线程,形成多条执行线索,每条线索,即每个线程也有它自身的产生、存在和消亡的过程。 线程间可以共享进程中的某些内存单元(包括代码与数据),线程的中断与恢复可以更加节省系统的开销。 5 2014/1/20 第 6 页

§12.2 Java中的线程 §12.2.1 Java的多线程机制 Java语言的一大特性点就是内置对多线程的支持。 Java虚拟机快速地把控制从一个线程切换到另一个线程。这些线程将被轮流执行,使得每个线程都有机会使用CPU资源。 6 2014/1/20 第7 页 §12.2.2 主线程(main线程) 每个Java应用程序都有一个缺省的主线程。 当JVM(Java Virtual Machine 虚拟机)加载代码,发现main方法之后,就会启动一个线程,这个线程称为“主线程”(main线程),该线程负责执行main方法。 JVM一直要等到Java应用程序中的所有线程都结束之后,才结束Java应用程序。 7 2014/1/20 第8 页 §12.2.3 线程的状态与生命周期 建的线程在它的一个完整的生命周期中通常要经历如下的四种状态: 1.新建: 当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态。2.运行:线程必须调用start()方法(从父类继承的方法)通知JVM,这样JVM就会知道又有一个新一个线程排队等候切换了。一旦轮到它来享用CPU资源时,此线程的就可以脱离创建它的主线程独立开始自己的生命周期了。 3.中断:有4种原因的中断: ◆JVM将CPU资源从当前线程切换给其他线程,使本线程让出CPU的使用权处于中断状态。 ◆线程使用CPU资源期间,执行了sleep(int millsecond)方法,使当前线程进入休眠状。 ◆线程使用CPU资源期间,执行了wait()方法。 ◆线程使用CPU资源期间,执行某个操作进入阻塞状态。 4.死亡:处于死亡状态的线程不具有继续运行的能力。线程释放了实体。 8 2014/1/20 第9 页 例子1(Example12_1.java )通过分析运行结果阐述线程的4种状态。例子1在主线程中用Thread的子类创建了两个线程(SpeakElephant.java , SpeakCar.java ),这两个线程分别在命令行窗口输出20句“大象”和“轿车”;主线程在命令行窗口输出15句“主人”。 例子1的运行效果如图12.4。 例子1在不同的计算机运行或在同一台计算机反复运行的结果不尽相同,输出结果依赖当前CPU资源的使用情况。 9 2014/1/20 第10 页 §12.2.4 线程调度与优先级 处于就绪状态的线程首先进入就绪队列排队等候CPU资源,同一时刻在就绪队列中的线程可能有多个。Java虚拟机(JVM)中的线程调度器负责管理线程,调度器把线程的优先

数控车床基本操作简单程序调试

数控车床的基本操作与简单程序调试 一、实训目的 < 1 >掌握数控车削加工基本编程指令及其应用 < 2 >熟悉了解数控车床的操作面板和控制软件; < 3 >掌握数控车床的基本操作方法和步骤; < 4 >进一步了解数控车床的结构组成、加工控制原理; < 5 >熟练掌握精车程序的输入调 二、预习要求 认真阅读数控车床组成、位置调整和坐标系设定及基本编程指令与调试的章节内容。 三、实训理论基础 1.基本编程指令功能介绍 1 ). G 功能 ( 格式: G 2 G 后可跟 2 位数 ) 常用 G 功能指令 (1) 、表内 00 组为非模态指令,只在本程序段内有效。其它组为模态指令,一次指定后持续有效,直到被本组其它代码所取代。 (2) 、标有 * 的 G 代码为数控系统通电启动后的默认状态。

2 ). M 功能 ( 格式: M2 M 后可跟 2 位数 ) 车削中常用的 M 功能指令有: M00-- 进给暂停 M01-- 条件暂停 M02-- 程序结束 M03-- 主轴正转 M04-- 主轴反转 M05-- 主轴停转 M98-- 子程序调用 M99-- 子程序返回。 M08-- 开切削液 M09-- 关切削液 M30-- 程序结束并返回到开始处 3 ). T 功能 ( 格式: T2 或 T 4 ) 有的机床 T 后只允许跟 2 位数字,即只表示刀具号,刀具补偿则由其它指令。 有的机床 T 后则允许跟 4 位数字,前 2 位表示刀具号,后 2 位表示刀具补偿号。如: T0211 表示用第二把刀具,其刀具偏置及补偿量等数据在第 11 号地址中。 4 ). S 功能 ( 格式: S4 S 后可跟 4 位数 ) 用于控制带动工件旋转的主轴的转速。实际加工时,还受到机床面板上的主轴速度修调倍率开关的影响。按公式: N=1000Vc / p D 可根据某材料查得切削速度 Vc ,然后即可求得 N. 例如:若要求车直径为 60mm 的外圆时切削速度控制到 48mm/min ,则换算得: N=250 rpm ( 转 / 分钟 ) 则在程序中指令 S250; 5 ).车床的编程方式 ( 1 ).绝对编程方式和增量编程方式。 图 2-1 编程方式示例 绝对编程是指程序段中的坐标点值均是相对于坐标原点来计量的,常用 G90 来指定。增量( 相对 ) 编程是指程序段中的坐标点值均是相对于起点来计量的。常用 G91 来指定。如对图 2-1 所示的直线段 AB 编程 绝对编程: G90 G01 X100.0 Z50.0; 增量编程: G91 G01 X60.0 Z-100.0;

实验一-Keil软件的使用及简单程序的调试方法

实验一Keil软件的使用及简单程序的调试方法 一、实验目的 掌握Keil的使用方法和建立一个完整的单片机汇编语言程序的调试过程及方法。 二、实验器材 计算机1台 三、实验内容 1.Keil的使用方法。 2.建立一个单片机汇编语言程序的调试过程及方法 四、实验步骤 1.Keil的使用方法。Keil C51 软件是众多单片机应用开发的优秀软件之一,它集编辑,编译,仿真于一体,支持汇编,PLM 语言和C 语言的程序设计,界面友好,易学易用。启动Keil 后的界面如下:

几秒钟后即进入Keil的编辑界面。用户便可建立项目及应用程序。 2.简单程序的调试方法 Keil是通过项目工程来管理汇编程序的。因此在调试程序前必须建立一个工程,工程名称及保存位置由用户来指定,注意每位同学的工程名称用“学号姓名实验*”来命名。 (1)建立一工程 单击Project菜单,在弹出的下拉菜单中选中New Project选项。并在弹出的对话框中确定保存的位置及工程名称。 又弹出一对话框,要求用户选择相应的硬件CPU及相关设置。选择Atmel公司的AT89C51单片机。如下图所示

单击“确定”后在弹出的对话框中行选择“否”即工程建好了,但该工程没有任何语句,需要再建一个程序文件并将其添加到此工程中。 (2)建一文件 单击“File”/“New”命令,则弹出文件的编辑窗口,此时该文件还没有指明其文件名称及保存位置,该文件还没有加载到所建立的工程中。单击“File”/“Save”命令在弹出的对话框中指明文件的类型为.ASM汇编型及文件名后单击“保存”即可进行汇编源文件的编辑。如下图所示。 (3)将文件添加到工程中 单击“T arget 1”前的“+”号则展开后变成“-”号,并右键单击“Source Group 1”在弹出的下拉菜单中执行“Add Files to Group ‘Source Group 1’”命令并弹出对话框在该对话框中的“文件类型”下拉列表中选择“Asm source file”后找到要添加的文件名并选中,单击“Add”即可。

java实验答案解读

实验一 水仙花数: class shuixianhua {//水仙花数 public static void main(String arg[]) { int i,a,a1,b,b1,c; for(i=100;i<1000;i++) { a=i%10; a1=i/10; b=a1%10; b1=a1/10; c=b1%10; if(i==(a*a*a+b*b*b+c*c*c)) System.out.println(i); } } } 输出如下: 153 370 371 407 打印出100以内素数: public class sushu { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int i,j,k=0; for(i=2;i<100;i++){ if(i==2) System.out.println(i); i++; for(j=2;j

k=1; } if(k==1) System.out.println(i); } } 求1!+2!+ (20) public class jiecheng { public static void main(String[] args) { int i,sum=0,k; for(i=1;i<=20;i++) { k=ji(i); sum=k+sum; } System.out.print(sum); } static int ji(int n) { if(n==1) return 1; else return ji(n-1)*n; } } 习题2.6 public class Test{ public static void main(String[] args)//第19题,打出图形.菱形{ int n=3; for(int i=1;i<=n;i++) { for(int k=n-1;k>=i;k--) { System.out.print(" "); } for(int j=1;j<=2*i-1;j++)//打印* {

Java第七单元练习题-Java多线程机制

7Java多线程机制 7.1单项选择题 1. 线程调用了sleep()方法后,该线程将进入()状态。 A. 可运行状态 B. 运行状态 C. 阻塞状态 D. 终止状态 2. 关于java线程,下面说法错误的是() A. 线程是以CPU为主体的行为 B. java利用线程使整个系统成为异步 C. 创建线程的方法有两种:实现Runnable接口和继承Thread类 D. 新线程一旦被创建,它将自动开始运行 3. 在java中的线程模型包含() A. 一个虚拟处理器 B. CPU执行的代码 C. 代码操作的数据 D. 以上都是 4.在java语言中,临界区可以是一个语句块,或者是一个方法,并用()关键字标识。 A. synchronized B. include C. import D. Thread 5. 线程控制方法中,yield()的作用是() A. 返回当前线程的引用 B. 使比其低的优先级线程执行 C. 强行终止线程 D. 只让给同优先级线程运行 6. 线程同步中,对象的锁在()情况下持有线程返回 A. 当synchronized()语句块执行完后 B. 当在synchronized()语句块执行中出现例外(exception)时 C. 当持有锁的线程调用该对象的wait()方法时 D. 以上都是 7. 在以下()情况下,线程就进入可运行状态 A. 线程调用了sleep()方法时 B. 线程调用了join()方法时

C. 线程调用了yield()方法时 D. 以上都是 8. java用()机制实现了进程之间的异步执行 A. 监视器 B. 虚拟机 C. 多个CPU D. 异步调用 类的方法中,toString()方法的作用是() A. 只返回线程的名称 B. 返回当前线程所属的线程组的名称 C. 返回当前线程对象 D. 返回线程的名称 语言具有许多优点和特点,下列选项中,哪个反映了Java程序并行机制的特点() A. 安全性 B. 多线程 C. 跨平台 D. 可移值 11.以下哪个关键字可以用来对对象加互斥锁?() A. transient B. synchronized C. serialize D. static 12.下面关于进程、线程的说法不正确的是( )。 A.进程是程序的一次动态执行过程。一个进程在其执行过程中,可以产生多个线程——多线程,形成多条执行线索。 B.线程是比进程更小的执行单位,是在一个进程中独立的控制流,即程序内部的控制流。线程本身不能自动运行,栖身于某个进程之中,由进程启动执行。 C.Java多线程的运行与平台无关。 D.对于单处理器系统,多个线程分时间片获取CPU或其他系统资源来运行。对于多处理器系统,线程可以分配到多个处理器中,从而真正的并发执行多任务。 7.2填空题 1.________是java程序的并发机制,它能同步共享数据、处理不同的事件。 2.线程是程序中的一个执行流,一个执行流是由CPU运行程序的代码、__________所形 成的,因此,线程被认为是以CPU为主体的行为。 3.线程的终止一般可以通过两种方法实现:自然撤销或者是__________. 4.线程模型在java中是由__________类进行定义和描述的。 5.线程的创建有两种方法:实现_________接口和继承Thread类。 6.多线程程序设计的含义是可以将程序任务分成几个________的子任务。 7.按照线程的模型,一个具体的线程也是由虚拟的CPU、代码与数据组成,其中代码与数 据构成了___________,线程的行为由它决定。 8.ava中,新建的线程调用start()方法、如(),将使线程的状态从New(新建状态)转换为 _________。 9.多线程是java程序的________机制,它能同步共享数据,处理不同事件。 10.进程是由代码、数据、内核状态和一组寄存器组成,而线程是表示程序运行状态的

PLC程序的调试方法及步骤(精)

PLC程序的调试方法及步骤 PLC程序的调试可以分为模拟调试和现场调试两个调试过程,在此之前首先对PLC外部接线作仔细检查,这一个环节很重要。外部接线一定要准确无误。也可以用事先编写好的试验程序对外部接线做扫描通电检查来查找接线故障。不过,为了安全考虑,最好将主电路断开。当确认接线无误后再连接主电路,将模拟调试好的程序送入用户存储器进行调试,直到各部分的功能都正常,并能协调一致地完成整体的控制功能为止。 1.程序的模拟调试 将设计好的程序写入PLC后,首先逐条仔细检查,并改正写入时出现的错误。用户程序一般先在实验室模拟调试,实际的输入信号可以用钮子开关和按钮来模拟,各输出量的通/断状态用PLC上有关的发光二极管来显示,一般不用接PLC实际的负载(如接触器、电磁阀等)。可以根据功能表图,在适当的时候用开关或按钮来模拟实际的反馈信号,如限位开关触点的接通和断开。对于顺序控制程序,调试程序的主要任务是检查程序的运行是否符合功能表图的规定,即在某一转换条件实现时,是否发生步的活动状态的正确变化,即该转换所有的前级步是否变为不活动步,所有的后续步是否变为活动步,以及各步被驱动的负载是否发生相应的变化。 在调试时应充分考虑各种可能的情况,对系统各种不同的工作方式、有选择序列的功能表图中的每一条支路、各种可能的进展路线,都应逐一检查,不能遗漏。发现问题后应及时修改梯形图和PLC中的程序,直到在各种可能的情况下输入量与输出量之间的关系完全符合要求。 如果程序中某些定时器或计数器的设定值过大,为了缩短调试时间,可以在调试时将它们减小,模拟测试结束后再写入它们的实际设定值。 在设计和模拟调试程序的同时,可以设计、制作控制台或控制柜,PLC之外的其他硬件的安装、接线工作也可以同时进行。 2.程序的现场调试 完成上述的工作后,将PLC安装在控制现场进行联机总调试,在调试过程中将暴露出系统中可能存在的传感器、执行器和硬接线等方面的问题,以及PLC的外部接线图和梯形图程序设计中的问题,应对出现的问题及时加以解决。如果调试达不到指标要求,则对相应硬件和软件部分作适当调整,通常只

JAVA实验6答案

广东海洋大学学生实验报告书(学生用表) 实验名称实验六. Java的接口与实现课程名称Java程序设计与开发 技术 课程号16232204 学院(系) 信息学院专业计算机科学与技术班级计科 学生姓名学号实验地点钟海楼 04019 实验日期 2015年 10月26日 一、实验目的 (1)学习掌握Java中类怎样实现接口、接口回调技术; (2)学习掌握Java 程序中面向接口的编程思想。 二、实验任务 完成实验六指导上实验1、实验2、实验3的实验任务。 三、实验仪器设备和材料 安装有J2SE开发工具的PC机。 四、实验内容和步骤 实验1 代码如下: Estimator.java interface CompurerAverage{ public double average(double x[]); } class Gymnastics implements CompurerAverage{ public double average(double x[]){ int count=x.length; double aver=0,temp=0; for(int i=0;i

for(int i=1;i2) aver=aver/(count-2); else aver=0; return aver; } } class School implements CompurerAverage{ public double average(double[] x){ int count=x.length; double sum=0; for(int i=0;i

Java第七单元练习题Java多线程机制

J a v a第七单元练习题 J a v a多线程机制 The latest revision on November 22, 2020

7Java多线程机制 7.1单项选择题 1. 线程调用了sleep()方法后,该线程将进入()状态。 A. 可运行状态 B. 运行状态 C. 阻塞状态 D. 终止状态 2. 关于java线程,下面说法错误的是() A. 线程是以CPU为主体的行为 B. java利用线程使整个系统成为异步 C. 创建线程的方法有两种:实现Runnable接口和继承Thread类 D. 新线程一旦被创建,它将自动开始运行 3. 在java中的线程模型包含() A. 一个虚拟处理器 B. CPU执行的代码 C. 代码操作的数据 D. 以上都是 4.在java语言中,临界区可以是一个语句块,或者是一个方法,并用()关键字标识。 A. synchronized B. include C. import D. Thread 5. 线程控制方法中,yield()的作用是() A. 返回当前线程的引用 B. 使比其低的优先级线程执行 C. 强行终止线程 D. 只让给同优先级线程运行 6. 线程同步中,对象的锁在()情况下持有线程返回 A. 当synchronized()语句块执行完后 B. 当在synchronized()语句块执行中出现例外(exception)时 C. 当持有锁的线程调用该对象的wait()方法时 D. 以上都是 7. 在以下()情况下,线程就进入可运行状态 A. 线程调用了sleep()方法时 B. 线程调用了join()方法时 C. 线程调用了yield()方法时 D. 以上都是 8. java用()机制实现了进程之间的异步执行

浙大JAVA实验题答案answer

实验8 Method的使用 1.程序填空题,不要改变与输入输出有关的语句。 50001 输入一个正整数repeat (0

调试程序的简单说明.

难怪很多前辈说调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言。不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件。 我以前接触的程序大多是有比较成形的思路和方法,调试起来出的问题都比较小,最近这个是我自己慢慢摸索调试,接触了很多新的调试方法,并查了很多前辈的总结,受益匪浅,总结以前的和新的收获如下: VC 调试篇 设置 为了调试一个程序,首先必须使程序中包含调试信息。一般情况下,一个从AppWizard 创建的工程中包含的Debug Configuration 自动包含调试信息,但是是不是Debug 版本并不是程序包含调试信息的决定因素,程序设计者可以在任意的Configuration 中增加调试信息,包括Release 版本。 为了增加调试信息,可以按照下述步骤进行: ? 打开Project settings 对话框(可以通过快捷键ALT+F7打开,也可以通过IDE 菜单Project/Settings 打开 ?选择C/C++页,Category 中选择general ,则出现一个Debug Info 下拉列表框,可供选择的调试信息方式包括: 命令行 Project settings 说明 无 None 没有调试信息 /Zd Line Numbers Only 目标文件或者可执行文件中只包含全局和导出符号以及代码行信息,不包含符号调试信息

/Z7 C 7.0- Compatible 目标文件或者可执行文件中包含行号和所有符号调试信息,包括变量名及类型,函数及原型等 /Zi Program Database 创建一个程序库(PDB,包括类型信息和符号调试信息。 /ZI Program Database for Edit and Continue 除了前面/Zi 的功能外,这个选项允许对代码进行调试过程中的修改和继续执行。这个选项同时使 #pragma 设置的优化功能无效 ? 选择Link 页,选中复选框"Generate Debug Info",这个选项将使连接器把调试信息写进可执行文件和DLL ?如果C/C++页中设置了Program Database 以上的选项,则Link incrementally 可以选择。选中这个选项,将使程序可以在上一次编译的基础上被编译(即增量编译,而不必每次都从头开始编译。调试方法: 1、使用 Assert(原则:尽量简单assert只在debug下生效,release下不会被编译。 2、防御性的编程 3、使用Trace 4、用GetLastError来检测返回值,通过得到错误代码来分析错误原因 5、把错误信息记录到文件中 位置断点(Location Breakpoint 大家最常用的断点是普通的位置断点,在源程序的某一行按F9就设置了一个位置断点。但对于很多问题,这种朴素的断点作用有限。譬如下面这段代码:

JAVA实验6答案

GDOU-B-11-112 广东海洋大学学生实验报告书(学生用表) 实验名称 实验六.Java 的接口与实现 课程名称JaVa 程序设计与开发 课程号16232204 技术 实验地点钟海楼实验日期 2015年 04019 10 月 26 日 、实验目的 (1) 学习掌握Java 中类怎样实现接口、接口回调技术; (2) 学习掌握Java 程序中面向接口的编程思想。 二、实验任务 完成实验六指导上实验1、实验2、实验3的实验任务。 三、实验仪器设备和材料 安装有J2SE 开发工具的PC 机。 四、实验内容和步骤 实验1 代码如下: Estimator.java in terface Compu rerAverage{ p ublic double average(double x[]); } class Gymn astics imp leme nts Compu rerAverage{ p ublic double average(double x[]){ int coun t=x.le ngth; double aver=0,te mp=0; for(i nt i=0;i

aver=aver+x[i]; } if(cou nt>2) aver=aver/(co un t-2); else aver=0; retur n aver; } } class School impi eme nts Compu rerAverage{ p ublic double average(double[] x){ int coun t=x.le ngth; double sum=0; for(i nt i=0;i

VB程序调试技巧

一,如果遇到了一些逻辑性很强的问题比如有循环什么的我的方法是在关键地方加入 变量 这样可以比较好地找到问题 二,msgbox 三,监视窗口,如下面的例子 For i=1 to 10000 A=sqr(i) next i 你想再监视当i=799时A的值,就可以添加监视,方法:点调试,添加监视,选择“当监视值为真时中断”,上面表达式框中写上i=799, 这样你按F5,运行程序,程序会在i=799时中断。其他选项你可以自己去琢磨一下。 一个程序如何顺利的“脱产”,调试的过程是非常重要的。学过、钻研过程序设计的人都有同样的感受,很多情况下,调试程序的过程会比程序编写的过程更为困难。任何一个天才都不敢说,他编的程序是100%正确的。几乎每一个稍微复杂一点的程序都必须经过反复的调试、修改,最终才完成。所以说,程序的调试是编程中的一项重要技术。 程序中的典型错误类型 A类:语法错误。 B类:编译错误。

C类:属性设置错误。 D类:逻辑错误。 调试方法 方法一:利用“MSDN帮助菜单” “MSDN帮助菜单”是一个很好的自学工具,对于出现调试对话框的菜单来说,可以按下“帮助”按钮查看错误原因。 对于一些不是很清楚的函数格式、保留字的作用,也可以借助“帮助菜单”。 方法二:逐过程检查 主要检查代码是否写对,位置有没有错误,关键是要确定一段代码是在哪个事件控制下的。 不妨先在脑海中把整个程序过一边,想一想究竟会有哪些事件发生(有些事件是人机互动的,例如:鼠标点击;而有些是机器自己执行的,这时要想到计时器的作用);然后想一想每一件事发生后有什么效果。我们代码所编写的一般就是事件发生后的这个效果,那么以此事件来决定代码所写的位置。

Java学习笔记(Java名词解释和多线程编程)

名词解释 & JAVA多线程编程 名词解释: JNI(Java Native Interface)指的是Java本地调用接口,通过这一接口,Java程序可以和采用其他语言编写的本地程序进行通信。 IPC是两个进程之间进行通信的一种机制。 JMX(Java Management Extensions)是SUN提出的Java管理扩展规范,是一个为应用程序、设备和系统植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议。通过JMX,用户可以灵活地开发无缝集成的系统、网络和服务管理应用。 JNDI(Java Naming and Directory Interface)是一种将对象和名字绑定的技术,对象工厂负责生产出对象,这些对象都和惟一的名字绑定。外部程序可以通过名字来获得某个对象的引用。 DTD即文档类型定义。 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,是Internet 传送E-mail的基本协议,也是TCP/IP协议组的成员。SMTP解决了E-mail系统

如何通过一条链路,把邮件从一台机器传递到另一台机器上的问题。通常把发送邮件服务器称为SMTP服务器。 POP3(Post Office Protocol3)即邮局协议第3版,这是Internet接收E-mail 的基本协议,也是TCP/IP协议组的成员。 IMAP(Internet Message Access Protocol)即直接收取邮件的协议,是与POP3不同的一种E-mail接收的新协议。 MIME(Multipurpose Internet Mail Extensions)是一种电子邮件编码方式,它可以将发信人的电子邮件中的文本以及各种附件都打包后发送。 SOAP(Simple Object Access Protocol)即简单对象访问协议,是在分散或分布式的环境中交换信息的简单协议,它以XML作为数据传送方式。 OOP即面向对象程序设计 OOA(Object Oriented Analysis)即面向对象的分析。 OOD(Object Oriented Design)即面向对象的设计。 OOI(Object Oriented Implementation)即面向对象的实现。

C Free 5程序调试方法

C Free 5.0 程序的单步调试 创建一份新的代码文件 可直接点击“文件”下的白色图标,或点击“文件”选择“新建”,或按快捷键“Ctrl + N”(C Free 5.0默认情况下新建的代码文件为.cpp 格式,可在“工具”、“环境选项”、“新建文件类型”中更改,C语言标准格式为.c 格式) 基于实例的C程序调试介绍 一、查看变量的内容 # include int main(int argc, char* argv[]) { int i; int sum; sum=0; for(i=1;i<=10;i++) sum=sum+i; printf("sum=%d",sum); return 0; } 第一步,打开C Free 5.0,输入上面的代码。 第二步,把光标移到“sum=0;”这一行,按F10 它的作 用是设 一个断 点,程序 运行到 这里时, 会停下 来。也就 是说,接 下来,程 序必须 通过按 F7键单 步运行 了。 第三步: 按F9 (开始调试) 我们发现有一箭头停留在这句语句上,它指示程序停留的位置,而箭头所在的语句(“sum=0;”)还没有执行。事实上,我们可以通过看一下内存变量sum的内容来验证。方法是这样的: 打开“调试”下的“监视”,或者按快捷键“Alt + 3”。 在“监视”的空白处点击鼠标右键,选择“添加监视”。

输入需要监视的变量名,这里输入为sum 这时我们可以在监视窗口中看到sum的内容不为0,而是一个随机的值。 第四步,我们按一下F7(进入),我们发现sum的内容变为0了。这说明“sum=0;”这句语句被执行了。 我们还可以用同样的方法看一下i的内容。 只需要鼠标点 第六步,一步一步地按F7,我们可以发现在单步执行for循环语句的时候i和sum的内容在不断变化。当退出循环时,我们发现i的内容为11(因为变量i的内容为11,i<=10这个条件不满足,所以程序退出循环)。 附带提一下,当程序已经执行了“sum=0;”这一句语句后,如果我们直接把光标移到“printf("sum=%d",sum);”,然后按Ctrl+ F8,我们可以直接把上面的for循环都执行了,而不必一步一步地按F7。在实践中,为了查找程序的逻辑错误,我们往往要单步运行该程序好几遍。如果已经通过单步调试验证某一段语句(如一个for循环语句或者几个用户定义的函数)正确了,我们就可以用Ctrl+ F8跳过这段语句,直接运行到还未测试的语句。二、F7(进入)和F8(跳过)的区别 # include int add(int m,int n) { int s; s=m+n; return s; } int main(int argc, char* argv[]) { int i=1; int j=2;

Java第七单元练习题Java多线程机制(20210109223217)

7 Java 多线程机制 7.1 单项选择题 1. 线程调用了sleep ()方法后,该线程将进入( )状态。 A. 可运行状态 B. 运行状态 C. 阻塞状态 D. 终止状态 2. 关于java 线程,下面说法错误的是() A. 线程是以CPU为主体的行为 B. java 利用线程使整个系统成为异步 C. 创建线程的方法有两种:实现Runnable 接口和继承Thread 类 D. 新线程一旦被创建,它将自动开始运行 3. 在java 中的线程模型包含() A. 一个虚拟处理器 B. CPU执行的代码 C. 代码操作的数据 D. 以上都是 4. 在java 语言中,临界区可以是一个语句块,或者是一个方法,并用()关键字标识。 A. synchronized B. include C. import D. Thread 5. 线程控制方法中,yield()的作用是() A. 返回当前线程的引用 B. 使比其低的优先级线程执行 C. 强行终止线程 D. 只让给同优先级线程运行 6. 线程同步中,对象的锁在()情况下持有线程返回 A. 当synchronized()语句块执行完后 B. 当在synchronized()语句块执行中出现例外( exception )时 C. 当持有锁的线程调用该对象的wait()方法时 D. 以上都是 7. 在以下()情况下,线程就进入可运行状态 A. 线程调用了sleep()方法时 B. 线程调用了join()方法时 C. 线程调用了yield()方法时 D. 以上都是 8. java 用()机制实现了进程之间的异步执行 A. 监视器 B. 虚拟机

相关文档
最新文档