idea 调试小心得
1、为什么需要Debug
目的:开发过程中 查找或定位错误或者阅读源码
程序运行的结果(4种情况)
情况1:没有任何bug,程序执行正确!
情况2: 运行以后,出现了错误或异常信息。但是通过 日志文件或控制台 ,显示了异常信息的位置。
情况3: 运行以后,得到了结果,但是结果不是我们想要的。
情况4: 运行以后,得到了结果,结果大概率是我们想要的。但是多次运行的话,可能会出现不是我们想要的情况。比如:多线程情况下,处理线程安全问题
2、Debug的步骤
1、添加断点
2、启动调试
3、单步执行
4、观察变量和执行流程,找到并解决问题
■ 断点的添加、取消、查看
添加/取消某个位置的断点:点击行号位置
查看所有断点:Ctrl + Shift + F8
取消所有断点: 点击查看所有断点,不勾选Java Line Breakpoints
调试中的断点意义:执行到了即生效了,就会暂停一下。
打多个断点的意义:整个项目也可以打一个断点,然后执行到想要观察的方法的调用,通过step into 进入观察,但是可能点快了,直接完执行方法调用。但是项目工程比较大,对于想要观察的方法打上一个断点,执行到了,它就会生效暂停,暂停一下更方便而已。
■ 设置好断点后,启动选择debug方式启动:
debug 键的位置:行号点击三角形可以选择,代码内容空白位置右键可以选择,菜单工具栏的运行臭虫子图标可以选择
代码中的打印、日志语句,执行后,在Debug模式下Console 观察
- 变量区的变量注意是当前方法栈的:
3、idea 调试快捷键

4、总结一下调试快捷键的使用

(1) 常用的:
观看下一步的单步调试[F8],进入方法体内部[F7],退出方法体,执行下一步[Shift+F8],直接跳到下一个断点[F9]
(2) 走神了:
回到当前文件断点位置[Alt+F10],跳到光标[Alt+F9],
太走神/观察不细致,那就重来一遍:回退到上一个方法调用的开始处[Drop Frame]
(3) 结束:
结束调试[Ctr+F2]、让当前断点后面的所有断点失效[Mute Breakpoints]
5、调试过程的其他小技巧
(1) Ctr+鼠标
- 点击目标进入,再次点击,如果不能再进入则会出来。目标可以是属性对象,也可以是类、是接口,是方法等等。
(2) Alt+箭头方向←
- 让光标回到上一个光标位置。有时候,因为Ctr+鼠标点击进入之后,在不移动光标位置,想退回上一个光标位置,那么Alt+←
(3) 全局搜索快捷键
Ctr+Shift+F
Ctr+Shift+N
(4) 定位当前打开的文件的位置
- 定位当前文件所在项目目录结构位置:

6、断点细分(重点:条件断点、线程调试)
(1) 方法断点:
- 刚进入方法会停顿一下
(2) 字段断点:
- 默认会停顿在字段值发生改变的位置
(3) 条件断点----适合观察循环体的代码执行流程
- 可以在断点位置,设置暂停的条件,右键断点

(4) 异常断点:
- 设置某种异常暂停
(5) 线程调试:
- 设置,观察某个线程的执行

7、调试实践和心得总结
举例分布式项目调试,比如有三个应用:admin应用-将任务主体存储到redis,master应用-将redis任务主体进行执行。其中,master实际上是远程调用了worker应用-去执行任务主体。
(1) 多个应用调试观察执行流程:
要注意流程中应用执行,从A应用执行着到了应用B应用,然后再继续执行到应用C,调试的时候,也要跟着流程切换应用的调式模式。
当A应用debug着,突然卡着的时候,就需要考虑这时候执行流程是不是进入了应用B了,切换到应用B的debug模式观察一下。
切换到C应用的时候,观察执行下一步,迟迟不肯进入下一步,考虑是不是A应用是不是得“放行”,B应用执行到下一步,C应用才有资格进行执行。
举例:B应用[master应用],断点停在了调用远程C应用[worker应用]的这一行时候:workerWebservice.execChat(chatExecParam);
然后,因为是远程调用,如果你还点击下一步,会进入的是B应用的反射底层代码,这时候,需要通过打断点跳到下一个断点(C应用)的代码位置,然后观察C应用的工作流程,但是C工作,真正想要执行run方法,需要B应用执行到下一步,相当于“放行”。
(2) 打断点要注意远程调用的代码位置不能打,否则项目跑不起来
举例:在@FeignClient的接口中的方法打了断点,导致项目启动失败。
- 执行流程:A服务远程调用B服务
// A服务,将chatExecParam 发送给B服务[worker] 去执行
workerWebservice.execChat(chatExecParam);
// 中间的Fegin负载均衡
@FeignClient("chat-worker")
public interface WorkerWebservice {
@RequestMapping(value = "/execChat", method = RequestMethod.POST)
boolean execChat(@RequestBody CrawlerExecParam crawlerExecParam); //《---在这里打了断点,导致A服务启动失败
}
// B服务
@Override
@RequestMapping(value = "/execChat", method = RequestMethod.POST)
public boolean execCrawler(ChatExecParam chatExecParam) {
workerContext.getThreadPool().execute(new ExecQueueScanRunnable(chatExecParam, masterWebservice));
return true;
}
- 错误信息:
2023-03-11 22:45:38.162 [WARN ] [main] com.netflix.config.sources.URLConfigurationSource - No URLs will be polled as dynamic configuration sources.
2023-03-11 22:45:38.172 [INFO ] [main] com.netflix.config.sources.URLConfigurationSource - To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
2023-03-11 22:45:38.855 [WARN ] [main] com.netflix.config.sources.URLConfigurationSource - No URLs will be polled as dynamic configuration sources.
2023-03-11 22:45:38.866 [INFO ] [main] com.netflix.config.sources.URLConfigurationSource - To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
2023-03-11 22:46:30.475 [INFO ] [main] o.s.scheduling.concurrent.ThreadPoolTaskExecutor - Initializing ExecutorService 'applicationTaskExecutor'
2023-03-11 22:47:43.098 [INFO ] [main] o.s.scheduling.concurrent.ThreadPoolTaskScheduler - Initializing ExecutorService 'taskScheduler'
2023-03-11 22:47:46.228 [INFO ] [main] com.alibaba.nacos.client.naming - initializer namespace from System Property :null
2023-03-11 22:47:46.275 [INFO ] [main] com.alibaba.nacos.client.naming - initializer namespace from System Environment :null
2023-03-11 22:47:46.315 [INFO ] [main] com.alibaba.nacos.client.naming - initializer namespace from System Property :null
分析原因:[▷下次抽空补充!]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
解决:取消掉在@FeignClient接口下的方法打断点
(3) idea 卡着不动/debug 执行太慢:
- 调试点击下一步,或者调试跳到下一个断点的时候,idea 卡着不动:
判断是否卡着:按键-结束调试是激活状态;重要的是在Variables 提示了一句:程序正在运行The application is running

程序真正(debug)结束:

- 原因分析:
① 可能原因1:方法断点会使得正在debug调试的程序变慢【建议:少用方法断点】
② 可能原因2:断点打太多。建议尽量不要在项目里打过多的断点,调试哪里就在哪里打上,调试完把断点去掉就好。
③ 可能原因3:执行的方法是远程方法(和网络有关)或者执行的方式是数据库操作有关。
心得总结
1、 建议:少用方法断点
2、 建议:不要打太多断点,为了观察方便,需要再打,观察完,可以去掉断点。
3、注意:如果项目是分布式项目,负载均衡@Feign的接口中的方法【 本来就不建议在方法的位置打断点了! 】,如果影响了项目启动,请取消断点。
如果本文对你有帮助的话记得给一乐点个赞哦,感谢!
idea 调试小心得的更多相关文章
- [UE4]蓝图调试小心得
假设某个功能由10个蓝图步骤组成,在第10步的某个蓝图函数的其中一个参数为none,可以使用not equal(Object)和Print从第10步开始,一步一步倒退到第一步检查,看看是哪一个步骤参数 ...
- eclipse debug (调试) 学习心得
eclipse debug (调试) 学习心得 进入debug模式: 1.设置断点 2.启动servers端的debug模式 3.运行程序,在后台遇到断点时,进入debug调试状态 ...
- GDB 进行调试 使用心得
GDB 进行调试 使用心得 转 1: 对于在应用程序中加入参数进行调试的方法: 直接用 gdb app -p1 -p2 这样进行调试是不行的. 需要像以下这样使用: #gdb app ...
- C语言中的调试小技巧
C语言中的调试小技巧 经常看到有人介绍一些IDE或者像gdb这样的调试器的很高级的调试功能,也听人说过有些牛人做工程的时候就用printf来调试,不用特殊的调试器.特别是在代码经过编译器一些比较复杂的 ...
- 微信移动端web页面调试小技巧
技术贴还是分享出来更加好,希望能对一些朋友有帮助,个人博客 http://lizhug.com/mymajor/微信移动端web页面调试小技巧
- ASP.NET MVC Autofac依赖注入的一点小心得(包含特性注入)
前言 IOC的重要性 大家都清楚..便利也都知道..新的ASP.NET Core也大量使用了这种手法.. 一直憋着没写ASP.NET Core的文章..还是怕误导大家.. 今天这篇也不是讲Core的 ...
- Windows7驱动调试小Tips
v:* { } o:* { } w:* { } .shape { }p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-botto ...
- 【移动端debug-6】如何做一个App里的web调试小工具
原文链接:如何做一个App里的web调试小工具 我们知道现在hybrid app非常流行,在这样的app里,h5页面是应用非常广泛的.相对于以往在pc端开发的网页,放在app里的网页由于无法直接使用桌 ...
- Qt使用com组件的一点小心得(使用Qt自带的工具dumpcpp生成.h和.cpp文件)
这几天工作中要用到Qt调用com组件,主要用到的类型有dll和ocx,使用他们的方法很简单:1.将com组件注册到系统中.2.使用Qt自带的工具dumpcpp将com组件生成cpp和头文件.3.然后就 ...
- 拼接Sql语句小心得
在往数据库插入数据时,需要根据数据和数据库中的列信息进行拼接,在本篇文章中,输出小心得.使用语言为 python. 拼接原始列信息 比如待插入数据库列信息为 deptNo,dName, Locate, ...
随机推荐
- pgsql给表字段设置默认值及设置主键
ALTER TABLE pavement_damage_dtl_temp add PRIMARY key(id); ALTER table pavement_damage_dtl_temp alter ...
- JavaScript基础知识整理(变量)
变量 ECMAScript变量有两种不同数据类型的值,分别是基本类型和引用类型,两者的不同在于基本类型值是简单的数据段,引用类型值一般指由多个值构成的对象 基本类型 基本数据类型包括5种:Undefi ...
- 天龙八部<三联版>四 终
叶二娘与虚竹相认,但黑衣僧却一语道破天机,原来虚竹乃是叶二娘与少林一位高僧的私生子,而黑衣僧,便是三十年前雁门关外的男主演萧远山,虚竹是萧远山所盗,而原因是因为虚竹的父亲乃是当年的带头大哥.迫于压力玄 ...
- 安装并学习git的基本使用;注册Github账号,并创建仓库,编辑自我介绍,并提交commit
安装.学习.注册Git成功,也创建了仓库和自我介绍. 但Git clone没有做,再打开Git网页一直出现错误,不理解.
- NOIP2015 pj
达成成就!--尝试不看题解的情况下用cpp打完了一套NOIP pj 题目全部在luogu上-- P2669 金币 题目描述 国王将金币作为工资,发放给忠诚的骑士.第一天,骑士收到一枚金币:之后两天(第 ...
- 【批量下载】url——wget,给定网址,批量下载文件
写在前面:最近在学习批量下载sci文章并传入noteexpress,从网上学来了一些方法,其中有一步需要使用url将sci-hub上面的文章批量下载下来. 学习网址:[研究生]快速批量下载 Web o ...
- AX2012 循环读取DataSource的记录
static void LoopFormDataSource(Args _args) { FormDataSource formDataSource; SalesLine salesLineSel, ...
- C# byte[]与string的相互转换
byte[]转string: string str = System.Text.Encoding.Default.GetString( byteArray ); string转byte[]: byte ...
- macOS开发应用Sign(签名)和Notarizaiton(公证)
签名 可执行文件签名: codesign -f -s ${证书ID} --timestamp ${签名文件} .Pkg安装文件签名: productsign --timestamp --sign ${ ...
- 网络同步时钟单路耐压测试突破17V
自动同步标准化考场时钟系统------专业LED时钟厂家![点击进入] 一.网络同步时钟耐压测试作用概述: 同步时钟耐压试验是鉴定时钟绝缘强度和稳定性最直接的方法,它对于判断NTP同步时钟设备能否投入 ...



