Java调试器–权威的工具列表

Java调试是一个复杂的空间。 调试器的类型很多,并且有很多工具可供选择。 在此页面中,我们将介绍7种类型的调试器之间的区别,并查看每个类别中的主要工具,以帮助您为正确的工作选择正确的工具。 公爵

以下是我们涵盖的调试器类型:

  • CLI调试器
  • IDE调试器
  • 构建自己的调试器
  • 堆转储
  • 历史调试器
  • 动态追踪
  • 生产调试
  • 塔基皮

定义

使用广泛的定义,错误是实例,其中我们编写的代码与我们获得的输入不匹配。 这些的不同影响可以大致分为–

  1. 意外的流控制 ,导致异常或代码中我们不想到达的位置。 在这里,调试器通常用于检查代码和状态的相关性。
  2. 意外的堆分配 。 在这种情况下,我们要么分配太多对象,要么分配太大。 保留对这些内容的长期引用只会增加乐趣。 这就是堆分析器起作用的地方。
  3. 延迟流量控制 。 这很可能与我们将错误的输入传递给外部调用(即“ SELECT * FROM everything”)或卡在长循环或无限循环中有关。 这是性能分析器通常会出现的地方。

当然,工具和类别之间存在重叠,因为它们本质上都具有相同的目的-让我们看到我们所期望的状态,以便我们可以修复代码,并使其达到期望。

1.命令行调试器

jstack

主要工具 :主要参与者是jdb ,它是JDK附带的,与JVM等效,是gdb。 它具有命令行界面,可以连接到正在运行的JVM。 像gdb一样,它的功能也很强大,您可以使用功能完备的IDE调试器使用jdb进行几乎任何操作。 jdb有一个补充-jstack-它使您可以在给定时刻打印实时JVM的线程调用堆栈。 但是,这不会捕获变量或堆状态。

以下情况下使用 :jdb的最大优点是其可移植性。 您可以相当快地将其安装到服务器上,而不必远程连接调试器。 如果您正在处理服务器上的恶劣环境,并且有能力让JVM检查它,那么jdb是您最好的朋友。

缺点 :jdb和jstack的缺点是,与其他命令行工具一样,它们在日常使用中效率不高。 这将我们带入下一个类别。

2. IDE调试器

网豆

主要工具 :Eclipse和NetBeans是该类别中的两个工具。 两者都使用与jdb类似的技术来附加或启动新的JVM。 虽然不是很轻便,但您确实会遇到很多麻烦,这可以使调试更短,更有趣。

以下情况下使用 :假设您每天都不是Dexter( 神童 ,而不是连环杀手)。

缺点 :作为高端桌面应用程序,它们不是您要在生产计算机上运行的东西。 始终存在进行远程调试的可能性,但是在复杂的环境中,解决该问题的可能性很小。

3.构建自己的调试器

blog_MyDebugger2

到目前为止,我们已经描述的所有调试器都基于相同的JVM开放调试架构,最常见的是使用JDWP(Java调试器有线协议)与正在运行的JVM进行通信。 JSwat是在此框架之上构建的独立调试器的示例。 是否想学习如何构建自己的Java / Scala调试器? 请点击这里 。

以下情况下使用 :构建自定义JVM扩展,或者对JVM的工作方式非常感兴趣。

缺点 :这是一件很复杂的事情,尤其是当您不想影响目标JVM的状态时,这是一件非常复杂的事情,因此您需要一个非常令人信服的理由来说明为什么您不能使用经过考验的现有工具。

4.堆转储

虚拟机

主要工具 :jmap,MAT。 在很多情况下,就像Rick Grimes一样 ,您正在与死者打交道。 在这些情况下,您正在查看的是JVM堆的快照,而不是已停滞的实时JVM的快照。 JDK附带的jmap允许您从实时JVM生成堆转储。 有很多工具可以让您浏览和分析转储。 jhat和visualVM都是JDK附带的,在这方面做得很好。 Eclipse插件MAT和NetBean的HeapWalker是很好的选择,因为它们利用了已经强大的IDE UI。

以下情况下使用 :发生复杂错误且无法应用常规调试技术(例如,该应用程序在客户的服务器上运行)。 另一种选择是通过打开JVM -HeapDumpOnOutOfMemoryError标志来使用堆转储来分析内存泄漏,以使JVM在堆耗尽后自动转储堆的内容。

缺点 :使用堆转储的最大缺点是它们的重量与堆本身的重量一样大(这很可能意味着堆在GB中)。 然后必须将其转回给您进行分析。 在生产中捕获它们也不是在公园中漫步。

5.历史调试器

chornon1

主要工具 :这种工具类别取决于您是否能够或不想停止JVM来收集状态或进行堆快照。 Chronon DVR是这种方法的一个很好的例子。 在此,调试器使用字节码检测从代码本身内部记录数据。 这通常包括诸如调用方法的顺序以及传递给它们的参数之类的事情。 这使调试器可以“重播”代码,并让您了解执行时的流控制。 重播解决方案(由CA收购)是另一种使用不同方法的示例,其中记录了对JVM的IO输入,然后将其“重播”回活动实例–模拟执行后的代码。

以下情况使用 此类工具的主要途径通常是在质量检查期间,通过捕获实际的运行时状态,它们可以帮助使错误更易于重现。 另一种情况是让客户或支持工程师临时运行该工具,以在应用程序在生产中表现异常时从JVM捕获状态。

缺点 :这些工具的最大缺点是日志记录会花费您很多时间,而日志记录会花费很多。 这意味着历史悠久的调试器可以将应用程序的速度降低50%到一个数量级,从而限制了可以使用这些应用程序的生产方案的数量。

6.动态跟踪

btraceResults

主要工具 :BTrace。 使用此类别中的工具,您可以从正在运行的JVM中有选择地打印(“跟踪”)状态信息,而无需停止它,也不必记录正在发生的一切。 可以将它视为动态编织到一段新代码中,该新代码从代码本身中打印值以供您查看。 BTrace是一个杰出的工具,它引入了自己的语法,可让您定义在代码上的何处以及要追踪的内容。 该语法还设计为仅支持只读操作,以防止您实际更改程序的状态或引起无限循环。

以下情况下使用 :最常用于尝试针对特定问题(例如连接池已耗尽)调试服务器或在不停止JVM执行的情况下临时收集特定统计信息的情况。

缺点 :与调试器一样,通常不建议从生产服务器进行动态跟踪(并且很多时间是不允许的)。 还有一个小的学习曲线,可以在服务器环境中有效地使用动态跟踪。

7.生产调试

Logstash

主要工具 :用于记录状态的日志记录框架(log4j,Logback)和用于按比例分析数据的日志分析器(Logstash,Splunk…)。

以下情况下使用 :这是一个相当坚韧的区域,因为当您处理生产系统时,使JVM停顿以查看状态或进行堆转储通常是很大的禁忌。 那是因为您实际上是要关闭服务器来调试它,这通常仅在极端情况下才能完成。

我们通常在运行时从JVM中提取状态而不停止状态的方法是通过有选择地将变量值记录到文件中(通常是在Java记录框架的帮助下)。 稍后,我们可以使用各种工具来解析数据,从简单到尾部,一直到可扩展的日志分析器,例如开源Logstash和企业Splunk。

缺点 :这里最大的缺点是我们当然需要事先知道(并有效地进行记录)。 日志也可以很快被填满,而且开发团队无需太多纪律,也可能包含很多不必要的数据或错过了一些关键数据。

科学家观察到,将日志文件中的数据拼接在一起以了解导致错误的可变状态,这是夜间和假日消遣的一种非常受欢迎的开发人员。


塔基皮

我们在构建Takipi时考虑了一个简单的对象。 我们想让开发人员轻松知道何时以及为什么生产代码中断。 这意味着每当新的异常或日志错误开始发生时,我们都会捕获它并通知您。 第二部分是跟踪部署,以判断问题从哪个原因开始以及发生的频率。 最后(也是最有趣的部分)是生产调试部分。 对于每个异常或错误,Takipi会在错误发生时向您显示确切的源代码和变量状态(包括本地值和对象值),就像发生错误时您就在那里一样。

参考: Java Debugger –我们的JCG合作伙伴 Tal Weiss在Takipi博客上的权威 工具清单 。

翻译自: https://www.javacodegeeks.com/2013/12/java-debugger-the-definitive-list-of-tools.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365426.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java项目中多个定时器_在java项目中如何使用Timer定时器

在java项目中如何使用Timer定时器发布时间:2020-11-16 16:36:16来源:亿速云阅读:97作者:Leah在java项目中如何使用Timer定时器?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大…

慎使用sql的enum字段类型

在sql的优化中,会有同学提到一点:使用enum字段类型,代替其他tinyint等类型。以前这也是不少人喜欢优化的,但是现在细想,是非常不合理的。 优点: 1.可以设置区间范围,比如设置性别:1男…

区分基于Ant目标的Gradle任务

在我的博客文章《 从Ant Build演变Gradle构建:导入Ant构建文件》中 ,我演示了如何使用Gradle内置的基于AntBuilder的Ant支持在Gradle构建中导入Ant目标。 然后,可以将这些Ant目标作为Gradle任务进行访问,并与Gradle构建直接引入的…

关于类的使用的几个关键

类的定义和声明必须放在main函数前 如果类中只有申明类而没有定义,则只能定义指针:Test *test;如果不定义类而仅仅声明类的话,当使用Test test时,编译器只知道Test是个class,但留多大空间?怎么初…

java判断对象已死_Java的JVM判断对象已死的基本算法分析

jvm中有各种的垃圾收集器,每个收集器都有各自的算法。但是一切的根本都需要找到找到应该被消除的对象,理解如何找到死亡对象才是理解垃圾收集器的基础。01两个基本算法a、引用记数法:对象中加一个引用计数器,每次被引用计数器加一…

java开发 职业技能_java编程开发程序员需要具备哪些职业技能

随着互联网的不断发展,java编程开发可以说是目前学习人数和应用范围非常多的一种编程语言了,而今天我们就一起来了解一下,java编程开发程序员需要具备哪些职业技能。1、数据结构和算法分析数据结构和算法分析,对于一名程序员来说&…

Django model转字典的几种方法

平常的开发过程中不免遇到需要把model转成字典的需求,尤其是现在流行前后端分离架构,Json格式几乎成了前后端之间数据交换的标准,这种model转dict的需求就更多了,本文介绍几种日常使用的方法以供参考,所有例子均基于Dj…

微信小程序日历课表

最近项目中使用到了日历&#xff0c;在网上找了一些参考&#xff0c;自己改改,先看效果图 wxml <view class"date"><image class"direction" src"/images/icon/left.png" bindtapminusMouth/><label>{{year}}年{{mouth}}月<…

java并发数据共享机制_Java并发编程:核心理论之数据共享性

原标题&#xff1a;Java并发编程&#xff1a;核心理论之数据共享性并发编程是Java程序员最重要的技能之一&#xff0c;也是最难掌握的一种技能。它要求编程者对计算机最底层的运作原理有深刻的理解&#xff0c;同时要求编程者逻辑清晰、思维缜密&#xff0c;这样才能写出高效、…

测试集准确率不变_这个医疗AI准确率突破天际,招来了铺天盖地的质疑

转自 | 量子位只要输入一次心跳的波谱。就能判断一个人有没有发生心力衰竭 (CHF) &#xff0c;准确率100%。这是英国华威大学领衔的团队&#xff0c;用机器学习方法做出的新成果。还登上了影响因子2.943的Biomedical Signal Processing and Control期刊。准确率眼看就要突破天际…

JavaFX自定义控件– Nest Thermostat第1部分

几周前&#xff0c;由于Hendrik Ebbers的出色文章 &#xff0c;我决定花一些时间观看有关JavaFX的JavaOne讨论。 我不得不说我已经学到了很多东西&#xff0c;只是看这些视频&#xff08;即使我还没有完成&#xff09;&#xff01; Gerrit的“使用力&#xff0c;路克”或使用J…

syslog可能引起得问题_牙齿经常有问题?可能是这4个坏习惯引起的,要改正

很多人明明很年轻&#xff0c;却得了很多牙齿疾病&#xff0c;甚至到了换牙的地步。牙齿虽然是最为坚硬的身体器官&#xff0c;但是即使再坚硬也是容易受到伤害的&#xff0c;日常生活中有很多小事都会造成对牙齿的伤害&#xff0c;想要保护牙齿&#xff0c;一定要改正一下这几…

jq实现前端文件上传

FormData FormData是XMLHttpRequest Level 2 新增的一个接口。 使用FormData可以实现各种文件上传。 使用 // 创建FormData的实例 var formdata new FormData();// 用append()为实例添加键和值 formdata.append(键名, 键值); 注意 使用jq的$.ajax()方法来进行文件上传时&am…

使用JUnitParams进行参数化的JUnit测试

参数化的单元测试用于在不同条件下测试相同的代码。 借助参数化的单元测试&#xff0c;我们可以建立一种测试方法&#xff0c;该方法从某些数据源中检索数据。 该数据源可以是测试数据对象&#xff0c;外部文件甚至数据库的集合。 一般的想法是使使用相同的单元测试方法测试不同…

js webpack 解决跨域问题_webpack-dev-server 作代理解决跨域,让你的本地开发飞起来...

最近在接到一个需求是做一个可视化的监控系统&#xff0c;mock数据来开发的话实在不太方便&#xff0c;况且数据量之大。查了一下资料&#xff0c;可以用webpack-dev-server作为代理&#xff0c;直接请求线上&#xff0c;哈哈哈&#xff0c;是不是很方便。### 目前我用的是webp…

实现用户操作指引功能

主要是通过定位找到需要指引的目标元素&#xff0c;然后再在蒙版上画一个div&#xff0c;设置为白色&#xff0c;定位到目标元素位置。思路大概就是这样。 图一&#xff1a; ![](https://img2018.cnblogs.com/blog/1354858/201811/1354858-20181105141942044-1763163359.png) 图…

vue2.0 element-ui中的el-select选择器无法显示选中的内容

我使用的是element-ui V2.2.3。代码如下&#xff0c;当我选择值得时候&#xff0c;el-select选择器无法显示选中的内容&#xff0c;但是能触发change方法&#xff0c;并且能输出选择的值。 select.vue文件 <template><div><div class"row" v-for&quo…

Gradle接口:Gradle构建元数据

正如我之前在“ 识别Gradle约定 ”和“ 从Ant Build演变Gradle构建&#xff1a;导入Ant构建文件 ”之类的文章中所显示的那样&#xff0c;可以通过Groovy访问Gradle的API来收集有关Gradle构建的重要信息。 在本文中&#xff0c;我演示了如何通过Gradle接口访问基本的Gradle构建…

php 工资 2018,佛山市2018年平均工资(社平工资)

2018年佛山市城镇非私营单位就业人员年平均工资为79824元(折合月平均工资6652)。2018年佛山市在岗职工年平均工资为80288元(折合月平均工资6691&#xff0c;四舍五入)。2018年佛山市城镇私营单位就业人员年平均工资为57297元(折合月平均工资4775)。广东地区2019年7月1日起市平均…

oj运行时错误如何查找原因_VLOOKUP又失灵?避免这四种错误类型

说起函数&#xff0c;你第一个想到什么&#xff1f;那绝对是表界曝光率最高的函数——VLOOKUP 了&#xff01;什么&#xff0c;你还不知道 VLOOKUP&#xff1f;那今天这篇文章&#xff0c;你可千万不能错过&#xff01;&#xff01;根据编号匹配姓名&#xff1b;根据评分匹配等…