记一次由于.netcore程序堆栈溢出的问题分析

背景

今天本来是星期五,工作中一切都很顺利,没想到群里有前端的同事艾特我说出问题了,说api访问返回了502,我的第一个反应是被nginx网关限流了,但是又分析其他的api都访问的挺好的,这一下子激发了我的挑战欲望。

解决问题步骤

步骤1.排查前端访问api的情况

api接口存在返回502的情况,第一反应就是nginx网关限流了,于是我调整了nginx的限流策略,但是接口502的情况依然存在,这下就更奇怪了,

步骤2.排查api接口代码问题

找到其中两个返回502的接口,本地通过postman调用,接口1没问题,但是接口2调用就报错了,果然发现了问题是堆栈溢出的问题,直接导致程序崩溃了,

步骤3.排查代码问题

发现是某个方法中采用了递归语法导致接口无限递归,进而导致程序中的堆栈溢出,程序就崩溃了。

问题分析:

从调用链可以看出:

  1. GetMenuNodes 方法调用了 ToList()

  2. ToList() 内部调用了 LINQ 操作

  3. LargeArrayBuilder 在分配缓冲区时发生堆栈溢出

步骤4. 分析出是数据问题导致的

由于这段递归代码是祖传老代码了,已经很久没有人改过这里了,那么就只能是数据问题了,

还记得上午在同事位置上闲聊,看到前端直接修改数据库,而且修改思路比后端的同事还熟悉,当时我就诧异了,刚出问题的时候我也没有想到这一块,然后结合刚好是这个同事在群里艾特我说api出问题了,这下就都通了。

步骤5. 分析数据到底哪里出问题了

原来将数据库中的一条数据的父级编码parent_page_code写为自己了,导致程序无止境的调用递归,导致了最后程序堆栈耗尽。

数据分析:

  • 第1行:page_code = 21001, parent_page_code = 21001自己指向自己

  • 其他行:page_code = 21001001, parent_page_code = 21001

问题在于:

  1. id=145 的记录中,parent_page_code = 21001 指向了自己的 page_code

  2. 这导致在递归构建树时,节点会把自己作为子节点

  3. 形成无限递归:21001 → 21001 → 21001 → ...

总结

从最初的api接口返回502状态码,误以为是nginx网关限流问题,排查分析得出是程序堆栈溢出的问题,那么程序又是如何出现这种幻觉的呢?

仔细分析一下:由于生产环境是通过systemctl部署在liunx服务中(启用了自动重启机制),如果前端一旦调用接口1的接口就会导致程序崩溃,但是systemctl会立马重启api,就在重启的过程中,如果再次有接口请求进来则都会返回502。

相关推荐
鸠摩智首席音效师10 天前
如何在 macOS 上安装 .NET Core ?
macos·.netcore
宝桥南山14 天前
Microsoft Agent Framework(MAF) - 如何将workflow或者A2A client转换成一个AI Agent
microsoft·ai·微软·aigc·.net·.netcore
滴滴答答哒24 天前
.NET Core 基于 AOP + Polly 实现数据库死锁自动重试
数据库·.netcore·sqlsugar
.NET修仙日记1 个月前
.NET EFCore批量插入性能优化实战:30秒 → 0.5秒
性能优化·c#·.net·.netcore·微软技术·efcore·踩坑实录
Kimhill张1 个月前
.net core8 WPF 依赖注入(DI)
wpf·.netcore
wangl_921 个月前
C# / .NET 在工业环境中的优势
开发语言·c#·.net·.netcore·.net core·visual studio
豆豆1 个月前
信创环境下CMS国产化适配实践:以.NET Core路线为例的技术验证
.netcore·cms·信创·国产化·建站系统·内容管理系统·网站管理系统
时光追逐者1 个月前
C#/.NET/.NET Core技术前沿周刊 | 第 70 期(2026年5.01-5.10)
c#·.net·.netcore
van久1 个月前
Day20:AutoMapper 对象映射
.netcore
van久1 个月前
Day23 登录 + 颁发 Token(DDD 四层架构 + 企业标准)
.netcore