如何利用ide进行跟踪调试_使用调试器进行事后跟踪

如何利用ide进行跟踪调试

我最近一直在使用的大多数调试器的好功能是能够在断点上记录信息。 这对于理解代码而无需修改是非常有用的,因为它涉及字节码修改。

让我们考虑一下这种非常琐碎且效率低下的函数实现,以返回斐波那契数列中的第n个数字。

public class Fib {public long fib(long number) {return number < 1 ? 0 :    // Breakpoint herenumber < 2 ? 1 : fib(number - 2) + fib(number - 1);}public static void main(String[] args) {Fib fib = new Fib();System.out.println(fib.fib(10L));}}

现在我们添加一个简单的断点,我将对其进行一些修改,以使其不会停止; 但是它将记录一个简单的表达式,该表达式为我们提供number的当前值

屏幕截图2014年1月7日的15.41.37

这为我们效率不高的代码提供了以下输出:

ebugger connected to local process.
Source breakpoint: Fib.java:11, evaluate(number)=10 (long)
Source breakpoint: Fib.java:11, evaluate(number)=8 (long)
Source breakpoint: Fib.java:11, evaluate(number)=6 (long)
Source breakpoint: Fib.java:11, evaluate(number)=4 (long)
Source breakpoint: Fib.java:11, evaluate(number)=2 (long)
Source breakpoint: Fib.java:11, evaluate(number)=0 (long)
Source breakpoint: Fib.java:11, evaluate(number)=1 (long)
Source breakpoint: Fib.java:11, evaluate(number)=3 (long)
Source breakpoint: Fib.java:11, evaluate(number)=1 (long)
Source breakpoint: Fib.java:11, evaluate(number)=2 (long)
... sometime later
Source breakpoint: Fib.java:11, evaluate(number)=1 (long)
Source breakpoint: Fib.java:11, evaluate(number)=2 (long)
Source breakpoint: Fib.java:11, evaluate(number)=0 (long)
Source breakpoint: Fib.java:11, evaluate(number)=1 (long)
55

因此,我们此处要做的是添加事后跟踪,您甚至可能无法访问源,仍然能够从代码的工作中获取有用的信息。

现在,与上面的示例明显不同的是,我们一次又一次地计算相同的值。 因此,这里是代码的另一个版本,它改用Map来存储序列中先前计算的值。 还请注意,在不使Lambda变得不那么漂亮的情况下,向此代码添加跟踪比在以前的情况下更加痛苦。

import java.util.HashMap;
import java.util.Map;public class Fib {Map<Long, Long> data = new HashMap<>();{data.put(1L, 1L);}public long fib(long number) {return data.computeIfAbsent(number,n -> n < 1 ? 0 : fib(n - 2) + fib(n - 1)); // Breakpoint here}public static void main(String[] args) {Fib fib = new Fib();System.out.println(fib.fib(10L));}}

这里需要注意两件事,首先,断点日志表达式应评估Lambda参数n的值,其次是您应始终将表达式放在新行上,以便将来的开发人员可以轻松地对其进行断点。 (现在,如果将代码放在其中,看起来会小很多/漂亮/聪明)。

因此,跟踪输出现在如下所示,因为每个值只计算一次,所以效果更好。

Debugger connected to local process.
Source breakpoint: Fib.java:17, evaluate(n)=10
Source breakpoint: Fib.java:17, evaluate(n)=8
Source breakpoint: Fib.java:17, evaluate(n)=6
Source breakpoint: Fib.java:17, evaluate(n)=4
Source breakpoint: Fib.java:17, evaluate(n)=2
Source breakpoint: Fib.java:17, evaluate(n)=0
Source breakpoint: Fib.java:17, evaluate(n)=3
Source breakpoint: Fib.java:17, evaluate(n)=5
Source breakpoint: Fib.java:17, evaluate(n)=7
Source breakpoint: Fib.java:17, evaluate(n)=9
55

该博客中的屏幕截图来自Jdeveloper。 但是Intelij和Netbeans中都提供了类似的功能,如果您有点狡猾,可以在Eclipse中获得类似的功能。

参考: Gerard Davison博客博客中使用 JCG合作伙伴 Gerard Davison 的调试器进行事后跟踪 。

翻译自: https://www.javacodegeeks.com/2014/01/post-hoc-tracing-using-a-debugger.html

如何利用ide进行跟踪调试

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

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

相关文章

马尔可夫Markov决策过程 MDP、马尔可夫奖励过程MRP

引言 在概率论及统计学中&#xff0c;马尔可夫过程&#xff08;英语&#xff1a;Markov process&#xff09;是一个具备了马尔可夫性质的随机过程&#xff0c;因为俄国数学家安德雷马尔可夫得名。马尔可夫过程是不具备记忆特质的&#xff08;memorylessness&#xff09;。换言…

母函数(Generating function)、矩母函数(Moment Generating Function)

1. 简介 在数学中&#xff0c;某个序列的母函数(Generating function&#xff0c;又称生成函数)是一种形式幂级数&#xff0c;其每一项的系数可以提供关于这个序列的信息。使用母函数解决问题的方法称为母函数方法。 母函数可分为很多种&#xff0c;包括普通母函数、指数母函…

Lambda表达式Java教程

在本文中&#xff0c;我们提供了全面的Lambda Expressions Java教程。 1. Lambda Expressions Java教程–简介 Lambda表达式被认为是Java 8中引入的最好的功能之一。Lambda表达式被认为是Java进入函数式编程世界的第一步 。 可以将其视为无需类即可创建的函数。 它也可以像参数…

随机过程

第一部分&#xff1a;为什么要研究随机过程&#xff1f; 人类认识世界的历史&#xff0c;就是一认识和描绘各种运动的历史&#xff0c;从宏观的天体运动到分子的运动&#xff0c;到人心理的运动-我们通称为变化&#xff0c;就是一个东西随时间的改变。 人们最成功的描绘运动的…

java steam_Java,Steam控制器和我

java steam您是否想过是否可以将现有的东西用于新的东西&#xff1f; 我看了一些所谓的“蒸汽控制器”&#xff08;从现在开始为SC&#xff09;的镜头&#xff0c;并看着我的游戏手柄。 问我自己是否有可能以类似蒸汽的方式使用它&#xff0c;我找到了一些Java库并创建了一个项…

如何在STS中创建Spring Boot项目

你好朋友&#xff0c; 在本教程中&#xff0c;我们将逐步介绍如何在STS&#xff08;Spring工具套件&#xff09;中创建Spring Boot项目。 步骤1&#xff1a; 如果您尚未从相应的操作系统的以下链接中下载Spring工具套件&#xff0c;请下载&#xff1a; https://spring.io/to…

置信区间(confidence interval)

要理解置信区间&#xff0c;就要从统计学最基本最核心的思想去思考&#xff0c;那就是用样本估计总体。 置信水平(Confidence level)是指总体参数值落在样本统计值某一区内的概率&#xff1b; 而置信区间&#xff08;confidence interval&#xff09;是指在某一置信水平下&…

卫星运动轨道

地球的自转轴与地球公转平面并不垂直&#xff0c;因此&#xff0c;黄道面和地球赤道面并不重合&#xff0c;而是有大约23.4的夹角&#xff0c;通常被称为黄赤交角&#xff0c;也称为转轴倾角、倾角&#xff08;obliquity&#xff09;或轴交角&#xff08;axial inclination&…

随机过程:指数分布、泊松过程、更新过程(renewal process)+大数定律

笔记主要基于中文版《应用随机过程 Introduction to Probability Models 》(Sheldon M. Ross)&#xff0c;只有非常少的一部分是我自己的注解。写这个笔记的目的是自己复习用&#xff0c;阅读需要一定的微积分和概率论基础。本人为初学者&#xff0c;且全部为自学&#xff0c;如…

接受拒绝采样(Acceptance-Rejection Sampling)

我们所说的抽样&#xff0c;其实是指从一个概率分布中生成观察值&#xff08;observations&#xff09;的方法。而这个分布通常是由其概率密度函数&#xff08;PDF&#xff09;来表示的。而且&#xff0c; 即使在已知PDF的情况下&#xff0c;让计算机自动生成观测值也不是一件容…

gradle文件不识别_识别Gradle约定

gradle文件不识别通过约定进行配置具有许多优点&#xff0c;尤其是在简洁方面&#xff0c;因为开发人员不需要显式配置通过约定隐式配置的内容。 但是&#xff0c;在利用约定进行配置时&#xff0c;需要注意这些约定。 这些约定可能已记录在案&#xff0c;但是当我可以编程方式…

Telesat、OneWeb及SpaceX三个全球宽带低轨卫星星座系统的技术对比

编者按&#xff1a;本文来自微信公众号“卫星与网络”&#xff08;ID&#xff1a;satnetdy&#xff09;&#xff0c;作者Inigo del Portilloa,*, Bruce G. Cameronb, Edward F. Crawleyc&#xff0c;编译 刘帅军、胡月梅&#xff08;中科院软件所&#xff09;&#xff0c;36氪经…

腾讯人均每月薪酬成本超8万元,员工总数首次超10万

11月10日&#xff0c;腾讯在23岁“生日”即将到来之际发布2021年第三季度业绩报告。财报显示&#xff0c;第三季度腾讯总收入为人民币1424亿元&#xff08;220亿美元 &#xff09;&#xff0c;同比增长13%&#xff1b;净利润(Non-IFRS&#xff09;317.5亿元&#xff0c;同比减少…

低轨卫星通信系统发展综述

最近几年低轨移动通信领域风起云涌&#xff0c;Iridium、OneWeb、Boeing、SpaceX 这些商业航天的 独角兽 都先后实施或宣布自己在这一领域雄心勃勃的计划。 通信、导航和遥感是卫星应用领域的三驾马车&#xff0c;简称 通导遥。鉴于任务特性&#xff0c;通信卫星和导航卫星通常…