JAVA调试技术

【java】Java 动态调试技术原理及实践 1.概述 转载:Java 动态调试技术原理及实践 一、动态调试要解决的问题 断点调试是我们最常使用的调试手段,它可以获取到方法执行过程中的变量信息,并可以观察到方法的执行路径。但断点调试会在断点位置停顿,使得整个应用停止响应。在线上停顿应用是致命的,动态调试技术给了我们创造新的调试模式的想象空间。本文将研究Java语言中的动态调试技术,首先概括Java动态调试所涉及的技术基础,接着介绍我们在Java动态调试领域的思考及实践,通过结合实际业务场景,设计并实现了一种具备动态性的断点调试工具Java-debug- 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> JAVA调试技术 前言 这份材料介绍JAVA的调试技术,范围涵盖普通程序和服务器端程序的调试。 很多程序员并没有认识到排除软件的错误的价值,如果你是一个JAVA开发者,就很值得读一读这个材料。在现代工具的帮助下,开发者成为一个好的调试者和成为一个好的程序员的重要性一样。 这个材料假设你已经有基本的JAVA编程的知识,如果你精通JAVA,这个材料也可以增加你很多知识。 如果你有其他语言的调试经验,你可以跳过基本知识部分。 即使是高级程序员开发的小程序也可能包含错误。你只需要理解调试的概念并熟悉合适的工具就可以成为好的调试者。这份材料将讲解JAVA调试的基本概念,也讨论高级的调试类型。我们将浏览不同的技术并且提供一些好的建议去帮助避免,追踪并最终修正程序的错误。 我们将通过一个调试范例以使你熟悉调试技术。我们也将使用开发源代码工具Jikes 和JDB向你演示如何调试服务器端和客户端程序。为了编译和运行范例代码,你需要先安装一个Java Development Kit (JDK) ,你可以参考后面的部分获得Jikes 和 JDB调试器。 关于作者 如果对这个材料的内容有任何问题,你可以联系作者Laura Bennett, lbenn@us.ibm.com。 如果对中文版的翻译有何意见和建议,请联系翻译者cherami ,cherami@163.net 。 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() 是java.lang 中的一个类, 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选项或者 Djava.compiler=NONE命令行参数 禁止JIT 编译器。如果你知道了方法和改方法所属类的名字,行号就不那么重要了。 诊断方法 Java 语言在Runtime() 类中提供方法跟踪你对JVM的方法调用。这些跟踪将产生你对JVM字节码的每一个方法调用的列表。注意这个列表可以产生大量的输出,所以在你的代码的小部分里面使用。 打开跟踪可以在代码中加入下面的行: traceMethodCalls(true) 关闭使用: traceMethodCalls(false) 打开JVM 并观察它向标准输出的输出。
java调试技术 java调试技术 帮你轻松解决java开发过程中的问题 立即下载

相关推荐

Java程序员应该知道的10个调试技巧

摘要:调试不仅可以查找到应用程序缺陷所在,还可以解决缺陷。对于Java程序员来说,他们不仅要学会如何在Eclipse里面开发像样的程序,更需要学会如何调试程序。本文介绍了Java程序员必知的10个调试技巧,保证让你受益匪浅!   调试可以帮助识别和解决应用程序缺陷,在本文中,作者将使用大家常用的的开发工具Eclipse来调试Java应用程序。但这里介绍的调试方法基本都是通用的,也适用于NetBeans IDE,我们会把重点放在运行时上面。   在开始之前,推荐大家去看看Eclipse shortcuts这篇文章,它将会给你带来很多方便。在本文中使用的是Eclipse Juno版(Ecl

Java动态调试技术原理及实践

Java动态调试技术是指在程序运行时,通过动态修改代码和调整参数来对程序进行调试和优化的技术。Java动态调试技术主要有两种方式:一种是使用Java Debug Wire Protocol(JDWP)进行远程调试;另一种是使用Java Instrumentation进行本地调试。在本文中,我们将主要介绍Java Instrumentation的动态调试技术。

我是Java程序员廖志伟,感谢朋友们的支持! 809

仿真每日一练 | 有限元模态分析详解

结构的振动一直是工业领域产品分析的重点,在振动的仿真分析中,模态分析是其最基本的分析类型,通过研究结构的固有频率和振型对产品的设计提供指导。2.2、在interaction模块,通过special->Spring,在各点之间分别创建弹簧单元,弹簧刚度为1000。2.1、在interaction模块,创建两个RP点,与两侧RP点各间隔100大小,如图3所示;其中M、K、C均为n*n的矩阵,s、x、v为n*1的矢量,n为系统自由度数量。3、在Assembly模块创建装配体,两点之间的距离为100,如图2所示;

ansysxuexizhe的博客 1655

java调试_深入Java调试

java调试 软件错误是开发过程中不可避免的一部分。 因此,Java调试是每个程序员都应具备的一项核心技能。 它不仅可以帮助您了解程序流程,还可以提高代码质量。 最后,它提高了您作为开发人员解决问题的能力,并最终提供了质量更高的软件。 本文深入探讨了Java调试的一些最重要的技巧和技术。 在生产环境中调试Java时,我们还将介绍最佳实践。 项目的Java调试 本节汇总了调试Java...

编程故事的地方 2225

Agilent N5230A矢量网络分析仪在射频器件S参数测试中的关键操作指南

本文详细介绍了Agilent N5230A矢量网络分析仪在射频器件S参数测试中的关键操作流程与技巧。内容涵盖从开机预热、校准(SOLT/ECal)、参数设置(频率、点数、功率、IFBW)到连接测量、数据保存分析的全过程,并分享了夹具去嵌入、时域分析等进阶功能与常见问题避坑指南,旨在帮助工程师获得精准可靠的散射参数测试结果。

kotlin6android的博客 401

论文超详细精读|万字:2s-AGCN

1. 提出了一种新的双流自适应图卷积网络(2S-AGCN)用于基于骨架的动作识别。**模型中的图的拓扑既可以统一地学习,也可以通过BP算法以端到端的方式单独学习。** 2. 提出了一种同时对**一阶和二阶信息(骨架的长度与方向)建模的双流框架**,在识别精度上有了显著的提高。 它将骨架数据的图结构参数化,并嵌入到网络中,与模型共同学习和更新。 3. 文章主要创新点有两个,一个是双流网络,另外一个是自适应。

IanYue的博客 6384

java深度调优技术_JVM原理与深度调优

JVM内存分配内存分配其实真正来讲是有三种的、但对于JVM来说只有两种栈内存分配:大家在调优的过程中会发现有个参数是-Xss 默认是1m,这个内存是栈内存分配, 在工作中会发现栈OutOfMemory Error内存溢出、就是因为它的内存空间不够了 一般情况下没有那么大的栈、除非你的一个方法里边有几十万行代码、一直往那压、不出,所以导致栈的溢出、栈的内存分配直接决定了你的线程数 、比如说你默认情况...

weixin_42349005的博客 327

ISP Tuning实战:从零开始调校相机传感器的完整流程(附避坑指南)

本文详细介绍了ISP Tuning的完整实战流程,即如何从零开始调校相机传感器以优化成像质量。内容涵盖从黑电平校正、镜头阴影校正等基础标定,到自动曝光、伽马校正、色彩校正等核心画质调校,再到降噪与锐化的平衡策略,并提供了关键的避坑指南。掌握ISP Tuning是提升相机传感器性能、实现从‘能用’到‘好用’的关键技术。

weixin_32098457的博客 196

高级09-Java调试技巧:快速定位与修复问题

Java调试技巧精要 本文系统介绍了Java调试的核心流程与工具集。调试是结构化的问题解决过程,涵盖问题复现、信息收集、假设验证、根源定位、修复测试和预防改进六个关键步骤。Java开发者常面临编译错误、运行时异常、逻辑缺陷、性能瓶颈、并发问题和内存泄漏等多种挑战。 Java生态提供了丰富的调试工具链,包括IDE集成调试器(IntelliJ/Eclipse)、JPDA标准架构及JDK命令行工具(jdb/jps/jstack/jmap等)

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

NHANES数据库的介绍及使用(一)

一、数据库概况 NHANES(National Health and Nutrition Examination Survey)是一项旨在评估美国成人和儿童健康和营养状况的研究计划,计划始于20世纪60年代初期,是一项针对不同人群或健康主题的调查。 1999年该调查成为一项持续计划,涉及各种健康和营养测量,项目每年调查一个全国代表性的样本,约5000人,这些人群位于全国各县,每年对其中15个县进行访问。 NHANES访谈部分包括人口统计学、社会经济学、饮食和健康相关问题。体检部分包括生理测量、实验室检查等

Christina 5万+

Yocto系列讲解[入门篇] 2 - 演示运行qemux86-64虚拟机

手把手教大家怎么编译Yocto,并运行一个qemux86虚拟机

fulinux的博客 1万+

奇淫巧技之idea调试

不断的断点有什么用? 你是否知道断点里面也可以写代码? 你是否因为调试接口需要登录,而感到烦恼?

liuzhanchao5678的专栏 207

从开票数据到 ML81N 一键过账:用 ABAP BAPI 批量创建 Service Entry Sheet 的落地方案

摘要:SAP ESM场景中,服务履约确认通常通过ML81N事务码创建服务条目表(SES)完成。本文介绍如何基于开票数据(VBRK/VBRP)自动生成SES:首先通过BAPI_PO_GETDETAIL获取采购订单服务行结构,然后使用BAPI_ENTRYSHEET_CREATE创建SES并覆盖开票数量与金额,最后调用BAPI_ENTRYSHEET_RELEASE自动释放。解决方案包含ALV交互界面、批量处理逻辑和结果跳转功能,实现从人工录入到自动化处理的转变。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 327

Java 动态调试技术原理及实践

总第367篇2019年 第45篇1. 动态调试要解决的问题断点调试是我们最常使用的调试手段,它可以获取到方法执行过程中的变量信息,并可以观察到方法的执行路径。但断点调试会在断点位置停顿,使得整个应用停止响应。在线上停顿应用是致命的,动态调试技术给了我们创造新的调试模式的想象空间。本文将研究Java语言中的动态调试技术,首先概括Java动态调试所涉及的技术基础,接着介绍我们在Java动态调试领域的思...

美团技术团队 9958

【项目解析】2KW 230V 数字逆变器控制系统(二)

【项目解析】 2KW 230V 数字逆变器控制系统(一) 项目的 交流输出电压 并不是单纯一个电压环就能控制好的,而是典型的 双环控制架构:最终占空比控制量会经过计算: 然后写入 单片机 TMM 定时器的比较寄存器 (TMGRA0/TMGRD0/TMGRC1), → 定时器输出互补 PWM, → 驱动 IGBT 全桥, → 经过 LC 滤波形成 230 VAC / 50Hz 的正弦电压。总结交流电压是双环控制的结果:目标/作用:把输出 RMS 电压稳到目标(例如 230 VAC);在母线波动与负载变化下

Naiva的博客 1298

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java调试技术

JAVA调试技术前言 这份材料介绍JAVA的调试技术,范围涵盖普通程序和服务器端程序的调试。很多程序员并没有认识到排除软件的错误的价值,如果你是一个JAVA开发者,就很值得读一读这个材料。在现代工具的帮助下,开发者成为一个好的调试者和成为一个好的程序员的重要性一样。这个材料假设你已经有基本的JAVA编程的知识,如果你精通JAVA,这个材料也可以增加你很多知识。

梦回盛唐 1247

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

JAVA调试技术--基础

JAVA调试技术前言 这份材料介绍JAVA的调试技术,范围涵盖普通程序和服务器端程序的调试。很多程序员并没有认识到排除软件的错误的价值,如果你是一个JAVA开发者,就很值得读一读这个材料。在现代工具的帮助下,开发者成为一个好的调试者和成为一个好的程序员的重要性一样。这个材料假设你已经有基本的JAVA编程的知识,如果你精通JAVA,这个材料也可以增加你很多知识。如果你有其他语言的

解惑 2185

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【转】Java 的调试技术

Java 的调试技术

u011756106的博客 257
上一篇: j2ee配置指南
下一篇: 本文只讨论如何在Windows NT 4.0上安装Apache Servlet
java169
博客等级 码龄18年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值