使用调试器进行事后跟踪

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

让我们考虑一下这种非常琐碎且效率低下的函数实现,以返回斐波那契数列中的第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

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

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

相关文章

链表排序c++代码_[链表面试算法](一) 链表的删除-相关题型总结(6题)

在数据结构的最高层抽象里&#xff0c;只有两种结构&#xff0c;数组和链表。这两种结构&#xff0c;是所有其他数据结构实现的基础。队列和栈&#xff0c;可以用链表和数组来实现。图&#xff0c;可以用邻接表和邻接矩阵来实现&#xff0c;其中&#xff0c;邻接表就是链表&…

JS原生方法实现jQuery的ready()

浏览器加载页面的顺序&#xff1a; 1、 解析HTML结构 2、 加载外部脚本和样式表文件 3、 解析并执行脚本代码 4、 构造HTML DOM模型ready() 5、 加载图片等组件 6、 页面加载完毕onload() ready事件是在DOM模型构造完毕时触发 load事件是在页面加载完毕后触发 function…

程序员高效工具列表

FQ必备 *** 文件管理器 wox 或者 Listary , everything 截图软件 Snipaste 下载器 Fish 冰点 Markdown 工具 Typora 图床工具 PicGo 思维导图 Xmind 抓包工具 Wireshark 协议工具 Fiddler 接口测试工具 PostMan 剪切板工具 Ditto 害怕截图丢失&#xff1f; 博客园…

c语言如何空格键返回主菜单,C语言中scanf函数与空格回车的用法说明

众所周知&#xff0c;C语言中的scanf函数的作用是从标准输入设备(通常是键盘)读取输入值&#xff0c;并存储到参数列表中指针所指向的内存单元。下面从几个方面说一下一些稍微细节的东西。下面的实验都在vc6.0中通过。1、scanf的返回值scanf通常返回的是成功赋值(从标准输入设备…

Linear_algebra_03_矩阵

1. 矩阵的线性运算&#xff1a; 2.1 矩阵的乘法&#xff1a;Xik * Ykj Zij 2.2 矩阵乘法性质&#xff1a; 3.1 矩阵的幂次方运算 3.2 矩阵转置的运算律 3.3 方阵运算 4 分块矩阵的运算 5. 矩阵的初等变换 5.1 单位矩阵I经过一次初等变换所得到的矩阵称为初等矩阵. 5.2 初等矩…

在Activiti中执行自定义查询

&#xff08;这可能最终会出现在Activiti 5.15版本的用户指南中&#xff0c;但是我已经想共享它了&#xff09; Activiti API允许使用高级API与数据库进行交互。 例如&#xff0c;对于检索数据&#xff0c;查询API和本机查询API的用法很强大。 但是&#xff0c;对于某些用例&a…

jquery ready方法实现原理

先看这两句代码&#xff1a;window.addEventListener(load,loaded,false);document.addEventListener(DOMContentLoaded,loaded,false);总结&#xff1a;load事件是在页面所有元素都加载完后触发;DOMContentLoaded&#xff0c;它是指dom tree加载完就触发;防止了页面加载被堵塞…

js转json工具_菜鸟丨Egert3D微信小游戏发布与Unity工具使用

本次教程将会为大家介绍Egret3D工具导出Unity场景对象的使用&#xff0c;以及发布微信小游戏流程。让大家对Egret 3D有更加熟悉的了解。需求工具&#xff1a;1、Unity场景导出插件&#xff1b;2、微信开发者工具。导出插件的使用一、打开需要导出的Unity场景&#xff0c;并且把…

MySQL----示例知识点整理

示例语句&#xff1a; select count(0),hour(c.created_at) from behavior_client_view c join behavior_share son c.share_uuids.uuidwhere s.agent_uuid(select uuid from user where mobile12606666333 and deleted0)and DATE_FORMAT(c.created_at,%Y-%m) >DATE_FORMAT(…

c语言c1变成e并输出,【图片】(原创)用纯C变了个变色输出字符的程序。。。【c语言吧】_百度贴吧...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include#includemain(){char c;int i,j,k,l,m,n,o;int x,y;char c1;int a,b,d,e;x35;y8;textcolor(13);gotoxy(35,10),cprintf("photoshop2014");textcolor(11);gotoxy(20,11);cprintf(" My name is zhou …

OI杂记

从今天开始记录一下为数不多天的OI历程 8.25 上 今天举行了难得的五校联考&#xff0c;模拟noip&#xff0c;题目的解压密码竟然是$aKnoIp2o18$&#xff0c;对你没有看错&#xff01;&#xff01;&#xff01; 7:50老师&#xff1f;啊啊啊啊&#xff0c;收不到题目啊&#xff0…

ebpf基础篇(二) ----- ebpf前世今生

bpf 要追述ebpf的历史,就不得不提bpf. bpf(Berkeley Packet Filter)从早(1992年)诞生于类Unix系统中,用于数据包分析. 它提供了数据链路层的接口,可以在数据链路层发送和接收数据.如果网卡支持混杂模式,所有的数据包都可以被接收,即使这些数据包的目的地址是其它主机. BPF最为…

Java,Steam控制器和我

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

unknown column in field list_tf.feature_column的特征处理探究

1. 背景tf.estimator是tensorflow的一个高级API接口&#xff0c;它最大的特点在于兼容分布式和单机两种场景&#xff0c;工程师可以在同一套代码结构下即实现单机训练也可以实现分布式训练&#xff0c;正是因为这样的特点&#xff0c;目前包括阿里在内的很多公司都在使用这一接…

jQuery clearQueue

clearQueue()方法与clearQueue()方法结合&#xff1b; .clearQueue()可用于删除通过.queue()方法添加到通用jQuery序列的任何函数。 示例&#xff1a; <!DOCTYPE html><html><head><style>div { margin:3px; width:40px; height:40px;position:absol…

Docker设置HTTP代理

参考资料&#xff1a;为docker配置HTTP代理服务器 一、注释掉namesserver的配置 [rootnvwa ~]# cat /etc/resolv.conf # Generated by NetworkManager search apa.gad.schneider-electric.com nameserver xx.xx.xx.xx nameserver xx.xx.xx.xx 改为&#xff1a; [rootnvwa ~]# c…

C语言oj中a b怎么做,【HDUOJ】第1002题 A + B Problem II 纯C语言解法

【HUDOJ-1002】1.原题&#xff1a;Problem DescriptionI have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A B.InputThe first line of the input contains an integer T(1<T<20) which means the number of tes…

截止到2013年,核心Java帖子

随着2013年即将结束&#xff0c;我最近发现了几篇与我认为“核心Java”知识有关的帖子。 该帖子列出了三个帖子&#xff0c;并提供了一个简短说明的论坛。 我这样做有两个目的&#xff1a;&#xff08;1&#xff09;帮助他人意识到这些优秀职位的存在&#xff1b;&#xff08;2…

jQuery 超屏加载

jQuery 超屏加载&#xff0c;当文档超出屏幕的高度时&#xff0c;加载最新下个列数据 $(window).scroll(function () {var height $(document).height(); //页面的高度var keheight $(window).height(); //浏览器可视的高度var sheight $(document).scrollTop(); //滚动的高…

爱是怎么产生的

怎么说你还是对你自己挺了解的 1. 你知道单身为什么最终都轮成单身狗吗&#xff1f;因为单身就是一种退化&#xff0c;连人类最基本的技能都忘干净了&#xff0c;活该你四角着地 2.你知道爱是怎么发生的吗&#xff1f;爱情这个词&#xff0c;绝对不是虚幻的&#xff0c;精神的&…