记一次 .NET 某零售管理系统 存储不足分析
一:背景
1. 讲故事
前几天有位朋友找到我,说他的程序会偶发性的报 存储空间不足,无法处理此命令 的错误,让我帮忙看下到底怎么回事,哈哈,人家是有备而来,dump都准备好了,话不多说,直接分析开干。
二:WinDbg 分析
1. 捕获dump中的异常
一般来讲别人说的只是一个参考,我们需要自己到dump中去验证,可以用 !t 观察下。
0:000:x86> !t
ThreadCount: 61
UnstartedThread: 0
BackgroundThread: 52
PendingThread: 0
DeadThread: 3
Hosted Runtime: no
Lock
ID OSID ThreadOBJ State GC Mode GC Alloc Context Domain Count Apt Exception
0 1 9310 004e24f8 26020 Preemptive 00000000:00000000 004d94e0 0 STA System.Runtime.InteropServices.COMException 42b57774 (nested exceptions)
...
0:000:x86> !PrintException /d 42b57774
Exception object: 42b57774
Exception type: System.Runtime.InteropServices.COMException
Message: 存储空间不足,无法处理此命令。 (Exception from HRESULT: 0x80070008)
InnerException: <none>
StackTrace (generated):
SP IP Function
00000000 00000001 mscorlib_ni!System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32, IntPtr)+0x2
003FAC0C 6F5655C9 mscorlib_ni!System.Runtime.InteropServices.Marshal.ThrowExceptionForHR(Int32, IntPtr)+0x9
003FAC10 55171671 PresentationCore_ni!MS.Internal.Text.TextInterface.Native.Util.ConvertHresultToException(Int32)+0x702961
003FAC24 54A56129 PresentationCore_ni!MS.Internal.Text.TextInterface.FontFace.GetDesignGlyphMetrics(UInt16*, UInt32, MS.Internal.Text.TextInterface.GlyphMetrics*)+0x79
003FAC60 54A73B77 PresentationCore_ni!System.Windows.Media.GlyphTypeface.GlyphMetrics(UInt16*, Int32, MS.Internal.Text.TextInterface.GlyphMetrics*, Double, System.Windows.Media.TextFormattingMode, Boolean)+0x47
...
从卦中信息看确实抛了一个 COMException 异常,并且真的有这么一条错误信息 存储空间不足,无法处理此命令,而且从调用栈来看貌似是wpf在处理 字形信息,一般来说这种代码是千锤百炼不会出任何问题的。
作为现代化的程序员,必须通过 百度搜索 寻找一下天涯沦落人,通过搜索得知大概有两种情况:
- 硬盘存储空间不足所致
- 内存不足所致

2. 是硬盘存储空间不足吗
要想验证是不是这种情况导致的,只能询问下朋友,据朋友反馈不存在这个问题,所以这条路就堵死了。
3. 是内存不足吗
要想排查这种情况只能观察进程的 MEM_COMMIT 指标,使用 !address -summary 。
0:000:x86> !address -summary
...
--- State Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
MEM_COMMIT 3773 6e617000 ( 1.725 GB) 89.86% 86.24%
MEM_RESERVE 702 c4c6000 ( 196.773 MB) 10.01% 9.61%
MEM_FREE 667 5513000 ( 85.074 MB) 4.15%
...
--- Largest Region by Usage ----------- Base Address -------- Region Size ----------
Heap32 23470000 fd0000 ( 15.812 MB)
<unknown> 474b0000 19c4000 ( 25.766 MB)
Image 2fbf1000 1180000 ( 17.500 MB)
Free 7355b000 1a5000 ( 1.645 MB)
Stack32 c50000 fd000 (1012.000 kB)
Stack64 5a0000 39000 ( 228.000 kB)
Other 8e0000 181000 ( 1.504 MB)
TEB64 7ee37000 2000 ( 8.000 kB)
Heap64 120000 65000 ( 404.000 kB)
TEB32 7ee39000 1000 ( 4.000 kB)
Other32 290000 1000 ( 4.000 kB)
PEB64 7efdf000 1000 ( 4.000 kB)
PEB32 7efde000 1000 ( 4.000 kB)
...
从卦中的信息看,当前程序提交内存是 1.7G ,看到这个值马上就想到了 2G虚拟地址,那这个程序是不是x86的呢?除了观察内存地址,也可以通过观察 PE 头获知。
0:000:x86> lm
start end module name
01380000 01450000 xxxWinApp C (no symbols)
0:000:x86> !dh xxxWinApp
File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
14C machine (i386)
3 number of sections
654073AD time date stamp Tue Oct 31 11:25:33 2023
0 file pointer to symbol table
0 number of symbols
E0 size of optional header
102 characteristics
Executable
32 bit word machine
从卦中的 32 bit word machine 来看,确实没有开大地址,看样子是受到了 2G 的虚拟地址限制。
不过说实话我真的佩服写这个软件的程序员,在上限 2G 的空间内,能将程序控制在 1.72G 都不崩,把内存压得严严实实,确实。
4. 如何开启大地址
开启大地址非常简单,可以用 DnSpy 打开我们的应用程序,然后勾选 Large Address Aware 选项,修改完之后进行保存,截图如下:

最后一个问题是开启后他的程序可以吃到 3G 还是 4G 呢?这个取决于是 x64 还是 x86 的操作系统,可以用 vertarget 观察。
0:000:x86> vertarget
Windows 7 Version 7601 (Service Pack 1) MP (4 procs) Free x64
Product: WinNt, suite: SingleUserTS
Edition build lab: kernel32.dll version: 6.1.7601.24545 (win7sp1_ldr_escrow.200102-1707)
Debug session time: Mon Nov 27 11:10:18.000 2023 (UTC + 8:00)
System Uptime: 5 days 8:49:46.984
Process Uptime: 1 days 0:50:00.000
Kernel time: 0 days 0:06:48.000
User time: 0 days 0:24:11.000
从卦中的 Windows 7 Version 7601 (Service Pack 1) MP (4 procs) Free x64 可知当前是 Windows7 x64 版本,即可以吃到 4G 内存,基本上就能解决这个问题。
三:总结
一般来说这种错误:存储空间不足,无法处理此命令 基本上 98% 都是内存空间不足导致的,只有 2% 的情况真的是 硬盘不足。
这个dump最有价值的地方在于没有纠结于 COMException 异常,并且在没有抛出 OutofMemoryException 异常的前提前定位出问题所在。
记一次 .NET 某零售管理系统 存储不足分析的更多相关文章
- 记一次 .NET 某风控管理系统 内存泄漏分析
一:背景 1. 讲故事 上个月中旬,星球里的一位朋友在微信找我,说他的程序跑着跑着内存会不断的缓慢增长并无法释放,寻求如何解决 ? 得,看样子星球还得好好弄!!! 不管怎么说,先上 windbg 说话 ...
- 日志分析工具、日志管理系统、syslog分析
日志分析工具.日志管理系统.syslog分析 系统日志(Syslog)管理是几乎所有企业的重要需求.系统管理员将syslog看作是解决网络上系统日志支持的系统和设备性能问题的关键资源.人们往往低估了对 ...
- 智能合约语言 Solidity 教程系列4 - 数据存储位置分析
写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解, 如果你还不了解,建议你先看以太坊是什么 这部分的内容官方英文文档讲的不是很透,因此我在参考Soli ...
- Eventlog Analyzer日志管理系统、日志分析工具、日志服务器的功能及作用
Eventlog Analyzer日志管理系统.日志分析工具.日志服务器的功能及作用 Eventlog Analyzer是用来分析和审计系统及事件日志的管理软件,能够对全网范围内的主机.服务器.网络设 ...
- 记C++课程设计--学生信息管理系统
C++课程设计--学生信息管理系统 ...
- 进度3_家庭记账本App_Fragment使用SQLite实现简单存储及查询
AddFragment.java: package com.example.familybooks; import android.content.ContentValues; import andr ...
- 记一次 .NET WPF布草管理系统 挂死分析
一:背景 1. 讲故事 这几天看的 dump 有点多,有点伤神伤脑,晚上做梦都是dump,今天早上头晕晕的到公司就听到背后同事抱怨他负责的WPF程序挂死了,然后测试的小姑娘也跟着抱怨...嗨,也不知道 ...
- 记一次 .NET 某RFID标签管理系统 CPU 暴涨分析
一:背景 1. 讲故事 前段时间有位朋友说他的程序 CPU 出现了暴涨现象,由于程序是买来的,所以问题就比较棘手了,那既然找到我,就想办法帮朋友找出来吧,分析下来,问题比较经典,有必要和大家做一下分享 ...
- BigData NoSQL —— ApsaraDB HBase数据存储与分析平台概览
一.引言 时间到了2019年,数据库也发展到了一个新的拐点,有三个明显的趋势: 越来越多的数据库会做云原生(CloudNative),会不断利用新的硬件及云本身的优势打造CloudNative数据库, ...
- ReportDB数据库存储选型分析
SQLServer关于reportDB的存储选型做如下分析: 网络存储两大主要类型: 1.NAS 支持的文件传输协议:NFS(unix/linux文件共享).SMB(windows).samba(li ...
随机推荐
- 文心一言 VS 讯飞星火 VS chatgpt (73)-- 算法导论7.1 4题
四.如何修改 QUICKSORT,使得它能够以非递增序进行排序? 文心一言: 快速排序(Quicksort)是一种常用的排序算法,基于分治策略进行设计.默认情况下,快速排序会以递增序进行排序.若想修改 ...
- API接口的应用场景
API数据接口的应用非常广泛,不同的行业和领域都可以使用API数据接口来获取所需的数据,从而实现数据分析.数据挖掘.数据统计等操作.以下是一些常见的API数据接口应用场景: 电商平台:例如淘宝.京东等 ...
- Codeforces 1254B1 - Send Boxes to Alice (Easy Version)
题意 有\(n(1\leq n\leq 10^5)\)个盒子,每个盒子有\(a_i(0\leq a_i \leq 1)\)个糖果,你每一次可以将第\(i\)个盒子里的糖果放到第\(i-1\)或\(i+ ...
- elasticsearch wildcard 慢查询原因分析(深入到源码!!!)
大家好,我是蓝胖子,前段时间线上elasticsearch集群遇到多次wildcard产生的性能问题, elasticsearch wildcard 一直是容易引发elasticsearch 容易宕机 ...
- git + docker + docker-compose + Jenkins+Linux 自动化构建、部署、测试过程
Jenkins三大概念: Job:即为任务 插件:maven构建项目.git拉取代码.ssh插件 工作空间:任务的存储空间,即为git代码的存储空间 开发者在本地开发,然后提交到 Source Res ...
- pandas常用的数据类型,(serises和dataform)
- Solution -「THUPC 2019」Duckchess
Description Link. 大模拟是不可能给你概括题意的. Solution (据说鸭棋题解用这个标题很吉利)(这里是被点名批评的 长度 19k 的打法)(先说好代码里 Chinglish 满 ...
- C++ RAII在HotSpot VM中的重要应用
RAII(Resource Acquisition Is Initialization),也称为"资源获取就是初始化",是C++语言的一种管理资源.避免泄漏的惯用法.C++标准保证 ...
- 解决WordPress修改固定链接结构后出现“404 Not Found”的情况
解决办法 在宝塔面板找到部署的站点设置 点击进入配置文件,复制下方这段代码粘贴进入配置文件,操作完这步,去刷新下我们的网站,再打开文章链接就可以正常打开.访问了. location / { try_f ...
- c语言代码练习16
//计算a,b间的最大值#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int ayue( int a, int b) { if ...