.NET理财客户端如何避免记一次OOM溢出问题?
摘要:一:背景 1. 讲故事 这是训练营里的学员找到我的,让我帮忙看下为什么他的客户程序会偶发的出现 报错弹框,由于dump比较敏感,这里就不截图发出来了,由于是错误弹框,并不会出现程序崩溃,而且朋友在日志中也看到了 OOM 异常,就是因为这个
一:背景
1. 讲故事
这是训练营里的学员找到我的,让我帮忙看下为什么他的客户程序会偶发的出现 报错弹框,由于dump比较敏感,这里就不截图发出来了,由于是错误弹框,并不会出现程序崩溃,而且朋友在日志中也看到了 OOM 异常,就是因为这个 OOM 异常导致了后续流程的 报错弹框,说这个程序的内存还行,在业务代码中用了 try catch 吞掉异常了,让我帮忙看下。
由于 OOM dump没到手,而且代码中使用 try catch 吞掉了,有些人可能就没撤了,其实知道 异常两阶段 的朋友应该知道,我们可以在 first chance 的时候抓dump,即 catch 之前,所以就有了下面的捕获脚本。
procdump 20860 -e 1 -f PAVException -ma -o D:\testdump\
顺利拿到dump之后,接下来就是一顿分析了。
二:OOM分析
1. 为什么会 OOM
双击 dump 之后,映入眼帘的就是异常线程的现场信息,参考如下:
This dump file has an exception of interest stored in it.
The stored exception information can be accessed via .ecxr.
(15fc.4fe8): C++ EH exception - code e06d7363 (first/second chance not available)
For analysis of this file, run !analyze -v
eax=2b1aefa0 ebx=19930520 ecx=00000003 edx=00000000 esi=037eebc0 edi=530bb548
eip=77383874 esp=2b1aefa0 ebp=2b1aeffc iopl=0 nv up ei pl nz ac pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000216
KERNELBASE!RaiseException+0x64:
77383874 8b4c2454 mov ecx,dword ptr [esp+54h] ss:002b:2b1aeff4=224e4fd8
从卦中可以看到 RaiseException 就是托管异常的明证,接下来用 .ecxr ; k 观察异常调用栈。
