记一次 .NET某企业数字化平台 崩溃分析 - 一线码农

记一次 .NET某企业数字化平台 崩溃分析 - 一线码农

💡 原文中文,约6500字,阅读约需16分钟。
📝

内容提要

文章分析了软件崩溃的原因,发现是由于栈溢出引起的异常。通过使用windbg工具,定位到SqlSugar库在处理表达式树时的递归调用导致了栈溢出。建议改用循环结构以避免此类问题,并更新代码以解决崩溃。

🔎

延伸解读

栈溢出异常的判定机制

文章指出,栈溢出异常(StackOverflowException)的判定依赖于哨兵页(PAGE_GUARD)。当rsp进入哨兵页时,会触发c00000fd异常,随后coreclr的MapWin32FaultToCOMPlusException方法将其转换为托管的StackOverflowException。这解释了为何栈溢出会被识别为特定异常,并提供了源码依据。

SqlSugar递归拆解表达式树的风险

分析发现,SqlSugar库在拆解表达式树时采用了递归调用。当用户代码中diffMonth很大时,expressionable会累积大量And条件,导致递归深度激增,最终引发栈溢出。文章建议将递归改为循环结构,以避免此类问题,并指出当前SqlSugar版本为5.1.4.143。

从托管堆字符串定位问题

在难以直接分析表达式树拆解代码时,文章采用逆向思路,通过!strings命令查看托管堆中的字符串。结果发现大量长度近10万的字符串,内容为And条件中的字段,这证实了表达式树拆解产生了大量SQL片段,从而辅助定位了问题根源。

❓

Q&A

导致软件崩溃的主要原因是什么?

软件崩溃的主要原因是栈溢出异常。

如何使用windbg工具分析崩溃问题?

使用windbg工具可以分析dump文件,自动定位崩溃时的寄存器和线程栈上下文。

SqlSugar库在崩溃中扮演了什么角色?

SqlSugar库在处理表达式树时的递归调用导致了栈溢出,从而引发崩溃。

如何避免栈溢出问题?

建议将递归结构改为循环结构,以避免栈溢出问题。

崩溃发生时的用户代码是怎样的?

崩溃发生时,用户代码在调用QueryAsync方法时,表达式树的拆解导致了异常。

推荐更新哪个版本的SqlSugar?

建议更新SqlSugar到版本5.1.4.143以解决崩溃问题。

🏷️

标签

➡️

继续阅读