程序调试技巧

news2024/11/28 19:04:14

多线程调试

有个开关的,在Eclipse里默认开启,在IntelliJ IDEA里默认是没有开启的。也就是说如果你在IDEA里代码里加断点,虽然一个线程的断了下来,但其他线程的已经执行过了。此处把线程的suspend设置成和Eclipse模式一样之后,也可以开始多线程应用的调试。简单设置可以直接在断点处,将suspend改成Thread
在这里插入图片描述
一个线程断下来之后,可以通过在线程窗口切换,到其它线程中继续运行。

IntelliJ IDEA里在这儿切换
在这里插入图片描述
我们看到main线程和pool-1-thread-1这两个线程都处于RUNNING状态,切换到任何一个都可以继续运行。

此时,就可以写一个多线程的应用,同时向ArryList这一类非线程安全的容器中存放内容,然后观察为什么他们是线程不安全的,会出现什么问题,生动又形象。

PS: 这里顺道说一下,这就是为什么创建线程时建议起一个有意义的名字,至少是可以识别的名字,否则在这里都不能区分出哪个是自己的线程,想切换还麻烦

后退执行

这里所说的后退执行,是有些时候我们在debug代码时,懒的每个方法都进入单步调试,就会出现你观察一个变量值的变化时,某个方法没跟进去,结果值就变了,不得不重来一次。

依靠后退执行的功能,可以后退,就像下棋时悔棋那种功能一样。当然,这个后退招待的名字是我自己起的,在IDE里被称为Drop Frame。
在这里插入图片描述
有了这个功能,我们在Drop 了当前这个Frame之后,已经改变的变量值不会恢复。比如你向当前调用方法里传入了一个List,并且在方法中向List里添加了内容,那在Drop到调用该方法的地方时,List不会恢复到之前的状态。

但是在该方法再次被调用时,你可以观察List什么时候被改变的,至少不需要再重跑一遍程序了。甚至你可以一言不合就后退。

条件断点

为了调试代码,就需要在要观察变更的地方添加断点,然后小心翼翼的一步步执行。但是如果是在一个循环里,又或者该方法会被多线程同时调用到的时候,你小心的向下单步调试,发现没有你关心的内容,又从循环开始处跑下来,还是没你的内容,人就开始烦燥起来。

其实,在添加断点的时候,我们可以为断点增加一定的条件,这样,在指定的条件满足时,断点才会生效。

IntelliJ IDEA内,在断点上右击,会弹出如下图的条件框,输入指定的条件即可。
在这里插入图片描述
有了条件断点,不相关,不感兴趣的代码就可以直接跳过了。

片段代码

有些时候在调试过程中,忽然想招待一段与此相关,但不在源文件中的代码来观察一下,辅助进行问题分析。此时你会停止程序,添加代码然后重新跑一次吗?

在IDEA里有一个执行代码片断的功能,可以在当前代码的上下文内,执行你临时写的代码。

例如,当前方法传入一个List,但这个方法里少一个你后面条件需要使用到的元素,此时你可以临时使用片断代码执行的功能,添加一个进去。

注意,在IntelliJ IDEA里,这个上面红框,像个小计算器的按钮就是临时执行的功能,点击之后,会弹出按钮下方这个Evaluate Expression的框,输入代码,点击右下角的Evalute即可。返回值会显示在Result处。
在这里插入图片描述
这就就相当于临时改变了变量内容。

然后,还可以调用对象的方法,执行功能,获取属性值等。
在这里插入图片描述

查看变量修改值

每个IDE在调试代码时都提供了一个观察当前上下文变量值的窗口。其实除了查看之外,一些非final的基本类型,还可以直接在此处修改值。这样如果多次循环执行时,每次可以恢复到期望的值,不需要重启程序。
在这里插入图片描述

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

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

相关文章

华为云云耀云服务器L实例评测|Elasticsearch的Docker版本的安装和参数设置 端口开放和浏览器访问

前言 最近华为云云耀云服务器L实例上新,也搞了一台来玩,期间遇到各种问题,在解决问题的过程中学到不少和运维相关的知识。 本篇博客介绍Elasticsearch的Docker版本的安装和参数设置,端口开放和浏览器访问。 其他相关的华为云云…

固定式工业RFID读写器有哪些特点?如何选型?

工业读写器可分为便携式读写器和固定式读写器,固定式读写器主要是将读写器固定在某一位置钟,常常应用在工位、生产、进入库等场景中。但是很多人并不了解固定式读写器都有哪些特点,具体应该怎么选型,下面我们就一起来了解一下。 固…

.Net Core后端架构实战【介入IOC控制反转】

引言 Inversion of Control,简称IOC,即控制反转。记得当初刚实习的时候公司的带我的人和我提到过IOC这个概念,当初完全不知道是 啥东西。后来有幸写了半年Java,SpringBoot里面业务开发随处可见IOC。再后来我写.Net Core用到的第一个框架Blog.Core项目,它里 面IRepository与R…

利用DMA的触发循环实现eTMR的PWM周期计数

利用DMA的触发循环实现对eTMR的PWM周期计数 文章目录 利用DMA的触发循环实现对eTMR的PWM周期计数引言分析问题eTMR的调试模式ModulizationFTM的多次重载事件终极大招-使用触发链 解决问题确认DMAMUX中的eTMR相关触发源eTMR产生触发信号 软件总结参考文献 引言 最近在同客户一起…

朝气蓬勃 后生可畏

介绍: 线段树是一棵二叉搜索树,思想与分治很想,把一段区间平分平分再平分,平分到不能平分为止,可以进行方便的区间修改和区间查询,当然,树状数组能做的单点修改、单点查询,线段树也可以更好地实现,总之,线段树是树状数组的升级版,此外,线段树能做的平衡树也能做,但…

Acwing 839. 模拟堆

Acwing 839. 模拟堆 题目描述思路讲解代码展示 题目描述 思路讲解 代码展示 #include <iostream> #include <algorithm> #include <string.h>using namespace std;const int N 100010;int h[N], ph[N], hp[N], cnt;void heap_swap(int a, int b) {swap(ph[…

2021-06-17 51蛋骗鸡0-99自动加减

缘由怎么实现两位秒表自动加减_嵌入式-CSDN问答 #include "REG52.h" sbit K1 P1^5; sbit K2 P1^6; sbit K3 P1^7; sbit K4 P1^4; //sbit LED1P1^0; //sbit LED2P1^1; //sbit LED3P1^2; //sbit LED4P1^3; bit k0; unsigned char code SmZiFu[]{63,6,91,79,102,10…

CentOS安装OpenNebula(一)

OpenNebula是一个非常成熟的云平台&#xff0c;&#xff0c;十分简单&#xff0c;但是功能十分丰富。它提供了十分灵活的解决方案&#xff0c;让用户能建立并管理企业云和虚拟的数据中心。 OpenNebula是专门为云计算打造的开源系统&#xff0c;用户可以使用Xen、KVM、VMware等…

JAVA 异常分类及处理

1 概念 如果某个方法不能按照正常的途径完成任务&#xff0c;就可以通过另一种路径退出方法。在这种情况下会抛出一个封装了错误信息的对象。此时&#xff0c;这个方法会立刻退出同时不返回任何值。另外&#xff0c;调用 这个方法的其他代码也无法继续执行&#xff0c;异常处理…

controller-manager学习三部曲之一:通过脚本文件寻找程序入口

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 关于《controller-manager学习三部曲》 《controller-manager学习三部曲》是欣宸原创的kubernetes深入学习系列之一&#xff0c;在前面的《client-go实战》系…

Pikachu靶场——目录遍历漏洞和敏感信息泄露

文章目录 1. 目录遍历漏洞1.1 源码分析1.2 漏洞防御 2. 敏感信息泄露2.1 漏洞防御 1. 目录遍历漏洞 漏洞描述 目录遍历漏洞发生在应用程序未能正确限制用户输入的情况下。攻击者可以利用这个漏洞&#xff0c;通过在请求中使用特殊的文件路径字符&#xff08;如 …/ 或 %2e%2e…

Acwing 838. 堆排序

Acwing 838. 堆排序 题目描述思路讲解代码展示 题目描述 思路讲解 堆是一颗完全二叉树&#xff0c;除了最下面一层&#xff0c;其余是满的&#xff0c;最后一层从左到右排列 小根堆&#xff1a;每个点小于等于左右两堆&#xff0c;所以根节点就是最小值 大根堆&#xff1a;每个…

2021-06-18 51蛋骗鸡实现流水灯累积点亮全亮后闪烁从头开始循环

缘由怎么在单片机上实现这个功能呢_有问必答-CSDN问答 #include "REG52.h" sbit K1 P1^5; sbit K2 P1^6; sbit K3 P1^7; sbit K4 P1^4; //sbit LED1P1^0; //sbit LED2P1^1; //sbit LED3P1^2; //sbit LED4P1^3; bit k1; unsigned char code SmZiFu[]{63,6,91,79,…

【U8+】用友U8建立账套,提示准备模板文件出错。

【问题描述】 用友U8在新建账套的过程中&#xff0c; 初始化环境&#xff0c;提示准备模板文件出错&#xff0c; SQL Server 阻止了对组件xp_cmdshell的过程sys.xp cmdshell的访问&#xff0c;因为此组件已作为此服务器安全配置的一部分而被关闭。 【解决方法】 出现这种错误…

【中秋国庆不断更】HarmonyOS对通知类消息的管理与发布通知(下)

一、发布进度条类型通知 进度条通知也是常见的通知类型&#xff0c;主要应用于文件下载、事务处理进度显示。HarmonyOS提供了进度条模板&#xff0c;发布通知应用设置好进度条模板的属性值&#xff0c;如模板名、模板数据&#xff0c;通过通知子系统发送到通知栏显示。 目前系统…

Java基础---第十一篇

系列文章目录 文章目录 系列文章目录一、说说List,Set,Map三者的区别?二、Object 有哪些常用方法?大致说一下每个方法的含义三、Java 创建对象有几种方式?一、说说List,Set,Map三者的区别? List(对付顺序的好帮手): List接口存储一组不唯一(可以有多个元素引用相同的对象…

28272-2012 米制超细牙螺纹 系列和基本尺寸

声明 本文是学习GB-T 28272-2012 米制超细牙螺纹 系列和基本尺寸. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了米制超细牙螺纹的基本牙型、直径与螺距系列和基本尺寸。 本标准适用于精密仪器和电子设备等领域的螺纹连接。 2…

Linux软硬连接与动静态库

硬链接 我们可以通过命令 ln myproc myproc-h 创建硬链接。 很容易发现 test&#xff08;源文件&#xff09; 和 mytest &#xff08;硬链接&#xff09;的文件大小是一样的&#xff0c;mytest的硬链接数从 1-> 2 通过 ls -i 文件名 我们还会发现&#xff0c;test 和 myte…

10以内字符与数字的转化(与ASCII码无关)

字符转整型数字 char a3; int ba1; cout<<b; 这样打印出的结果是51&#xff1b;显然我们想打印出的结果是4&#xff1b; 那么下面介绍一种极其简单的方法&#xff1b; 1.利用“ -0 ” char a6; int ba-01; cout<<b; 输出结果就是7&#xff1b; 不过这种方…