idea 运行java程序不报错,debug调试报错,求各位大佬解决!!!?
7 个回答
我也遇到这个问题了,最开始想换个路径,但是根本找不到更改路径的方式,这个路径中的中文还不是我一个区区凡人可以修改的,想改的话估计要重装系统了。
我IDEA是装在D盘的,但这个jar包,是在C盘用户文件夹下Temp文件夹内,猜测是临时生成的。
然后发现不debug的时候是没有这个路径的文件的,所以这俩是debug的时候才生成的。
一阵瞎捣鼓,最后解决了问题。
把这个禁用掉。
虽然我也不知道为啥,反正禁用了就可以debug了。
这个是我写的: IDEA关于-javaagent中文路径导致无法debug的初步解决方案 - SnowPhoenix - 博客园
///////////////////////////////////////////
2020.6.29更新
前面的方案貌似会导致覆盖性测试无法进行,我觉得正确的方案应该是改一下系统环境变量里,用户的TMP和TEMP,把它改成和系统的TMP和TEMP一样。
我因为升级SSD所以重装系统了,所以我现在没法试试这个新的方案是否有效,大伙儿可以试试。
可能原因:目录“~~/刘强/~~~”,不建议中文建立目录,改成英文试试。
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.