分享Debug设置断点学习分析堆栈信息,判断错误方位的经历

描述错误:服务启动后无法读取Nacos上对应的默认服务配置即${applicationname}.yaml配置

 

查找错误开始之初以为是框架问题,或者引用依赖问题导致。因为通过日志发现仅有几个新增的服务模块启动时无法读取默认名称的服务配置。

如下是正常情况,当服务启动时会预先加载两个共享的配置文件,然后(这里是我的猜测,并没有看Nacos很多文档,但是后面堆栈调用分析证实了我的猜测)再加载每个应用的默认的配置文件。问题就出现在红框的配置文件无法读取/读取不到

如下是出错时的日志文件,会发现无法读取blade-tps-epcs.yaml文件,或者应该是没有读取到日志文件导致的没有该行日志产生。所以找到该日志打印的方法就可以判断出问题所在了。

这种情况非常诡异,因为该文件按理说是默认Nacos都会加载的。上面blade.yaml和blade-test.yaml是通过配置spring.cloud.nacos.config.shared-dataids设置的共享配置文件。

该问题找了一天,也找了该框架社区开发人员均无法找到答案。当晚上静下心来的时候(其实是绝望了),就想着那就通过打断点一步一步走来找到错误方位。

断电调试找出错误

下面言简意赅的讲,多为图

下面是堆栈信息

为什么我会在这里打断点是因为上面的图片中加载配置的日志信息是从NacosPropertySourceBuilder的类中打印出来的日志信息,所以打印该日志的方法一定是在该类中,并且当看到下面方法中的log.info更加深了我的肯定。而且当看到if判断时就大概明白是什么情况了。应该是blade-tps-epcs.yaml读取不到配置数据导致data为null,跳过了该IF方法才会出现该情况。索性断电不能白打又为了了解流程我又通过往上翻堆栈在名字为NacosPropertySourceLocator中设置断点(如何找到,通过分析堆栈中的名称命名该类为nacos配置源加载类,又或者堆栈不深可以一个一个点分析对应的参数)

来到读取配置方法的上一级之后发现该配置先读取的共享文件(loadSharedConfiguration)、再读取扩展文件(loadExtConfiguration)、最后才是默认的加载的应用配置(loadApplicationConfiguration),dataIdPrefix就是该配置文件的文件名前缀(后缀根据设置有.yaml和properties)。当然这段是扩展,因为我也是第一次分析堆栈比较好奇。就往前看了一下流程,为什么先有之前预先设置的才有默认的加载毕竟不想每次都点两次通过,因为bladex.yaml和bladex-test.yaml两个是有数据的,我只想验证最后bladex-tps-epcs.yaml是否是因为未读取到数据才导致的该问题。

 

经过上面的分析,我就将断点打到了NacosPropertySourceLocator中的第61行。当断点到时,再将断点打到NacosPropertySourceBuilder的63行,来分析看为什么会不走if内的语句(其实已经猜到了是未读取配置文件,因为第61行不可能不走,就算没走情况也是报异常才对,到第63行没进if就说明获取到的data为null,这时就有两种情况一种为命名错误(忽略的原因是我对了好几遍),一种为配置文件读取不到)。下图为印证我的猜想。

 

为了更加确认,我在nacos上新建了命名空间和对应配置的文件。发现新增配置文件的均无法读取到,那些共享的配置也读取不到了。更加说明框架是没有问题的,问题出在Nacos上(连续运行五个月未停过,按理说这种东西配置新增都是热加载才对,而且之前都是可以的,就没有将怀疑往该工具上想)

 

最后重启Nacos,配置文件可以读取到!错误解决!但是还是建议不要使用Nacos1.1.3版本更换1.1.4以上的版本使用。 

(不知道是否是因为连接服务很多的原因Nacos每天产生的日志多达1G。重启的时候看了一眼日志文件竟然有77G的日志吓死人了。记得每天清理日志不知道这也是1.1.3版本的问题不是)

全部评论

相关推荐

想干测开的tomca...:让我来压力你!!!: 这份简历看着“技术词堆得满”,实则是“虚胖没干货”,槽点一抓一大把: 1. **项目描述是“技术名词报菜名”,没半分自己的实际价值** 不管是IntelliDoc还是人人探店,全是堆Redis、Elasticsearch、RAG这些时髦词,但你到底干了啥?“基于Redis Bitmap管理分片”是你写了核心逻辑还是只调用了API?“QPS提升至1500”是你独立压测优化的,还是团队成果你蹭着写?全程没“我负责XX模块”“解决了XX具体问题”,纯把技术文档里的术语扒下来凑字数,看着像“知道名词但没实际动手”的实习生抄的。 2. **短项目塞满超纲技术点,可信度直接***** IntelliDoc就干了5个月,又是RAG又是大模型流式响应又是RBAC权限,这堆活儿正经团队分工干都得小半年,你一个后端开发5个月能吃透这么多?明显是把能想到的技术全往里面塞,生怕别人知道你实际只做了个文件上传——这种“技术堆砌式造假”,面试官一眼就能看出水分。 3. **技能栏是“模糊词混子集合”,没半点硬核度** “熟悉HashMap底层”“了解JVM内存模型”——“熟悉”是能手写扩容逻辑?“了解”是能排查GC问题?全是模棱两可的词,既没对应项目里的实践,也没体现深度,等于白写;项目里用了Elasticsearch的KNN检索,技能栏里提都没提具体掌握程度,明显是“用过但不懂”的硬凑。 4. **教育背景和自我评价全是“无效信息垃圾”** GPA前10%这么好的牌,只列“Java程序设计”这种基础课,分布式、微服务这些后端核心课提都不提,白瞎了专业优势;自我评价那堆“积极认真、细心负责”,是从招聘网站抄的模板吧?没有任何和项目挂钩的具体事例,比如“解决过XX bug”“优化过XX性能”,纯废话,看完等于没看。 总结:这简历是“技术名词缝合怪+自我感动式凑数”,看着像“背了后端技术栈名词的应届生”,实则没干货、没重点、没可信度——面试官扫30秒就会丢一边,因为连“你能干嘛”都没说清楚。
点赞 评论 收藏
分享
头像
10-27 15:50
门头沟学院 Java
想进开水团喝开水:有一种店 只能外卖 不能堂食 你猜为什么
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务