一:背景

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 某零售管理系统 存储不足分析的更多相关文章

  1. 记一次 .NET 某风控管理系统 内存泄漏分析

    一:背景 1. 讲故事 上个月中旬,星球里的一位朋友在微信找我,说他的程序跑着跑着内存会不断的缓慢增长并无法释放,寻求如何解决 ? 得,看样子星球还得好好弄!!! 不管怎么说,先上 windbg 说话 ...

  2. 日志分析工具、日志管理系统、syslog分析

    日志分析工具.日志管理系统.syslog分析 系统日志(Syslog)管理是几乎所有企业的重要需求.系统管理员将syslog看作是解决网络上系统日志支持的系统和设备性能问题的关键资源.人们往往低估了对 ...

  3. 智能合约语言 Solidity 教程系列4 - 数据存储位置分析

    写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解, 如果你还不了解,建议你先看以太坊是什么 这部分的内容官方英文文档讲的不是很透,因此我在参考Soli ...

  4. Eventlog Analyzer日志管理系统、日志分析工具、日志服务器的功能及作用

    Eventlog Analyzer日志管理系统.日志分析工具.日志服务器的功能及作用 Eventlog Analyzer是用来分析和审计系统及事件日志的管理软件,能够对全网范围内的主机.服务器.网络设 ...

  5. 记C++课程设计--学生信息管理系统

                                                                                  C++课程设计--学生信息管理系统     ...

  6. 进度3_家庭记账本App_Fragment使用SQLite实现简单存储及查询

    AddFragment.java: package com.example.familybooks; import android.content.ContentValues; import andr ...

  7. 记一次 .NET WPF布草管理系统 挂死分析

    一:背景 1. 讲故事 这几天看的 dump 有点多,有点伤神伤脑,晚上做梦都是dump,今天早上头晕晕的到公司就听到背后同事抱怨他负责的WPF程序挂死了,然后测试的小姑娘也跟着抱怨...嗨,也不知道 ...

  8. 记一次 .NET 某RFID标签管理系统 CPU 暴涨分析

    一:背景 1. 讲故事 前段时间有位朋友说他的程序 CPU 出现了暴涨现象,由于程序是买来的,所以问题就比较棘手了,那既然找到我,就想办法帮朋友找出来吧,分析下来,问题比较经典,有必要和大家做一下分享 ...

  9. BigData NoSQL —— ApsaraDB HBase数据存储与分析平台概览

    一.引言 时间到了2019年,数据库也发展到了一个新的拐点,有三个明显的趋势: 越来越多的数据库会做云原生(CloudNative),会不断利用新的硬件及云本身的优势打造CloudNative数据库, ...

  10. ReportDB数据库存储选型分析

    SQLServer关于reportDB的存储选型做如下分析: 网络存储两大主要类型: 1.NAS 支持的文件传输协议:NFS(unix/linux文件共享).SMB(windows).samba(li ...

随机推荐

  1. React-Chat移动端聊天实例|react18 hooks仿微信App聊天界面

    基于react18+react-vant+zustand仿微信手机端聊天室ReactChat. react18-chat 一款使用最新react18.x hooks.zustand搭配react-va ...

  2. 几种常用到的 Hybrid App 技术框架

    移动操作系统在经历了诸神混战之后,BlackBerry OS.Symbian OS.Windows Phone 等早期的移动操作系统逐渐因失去竞争力而退出.目前,市场上主要只剩下安卓和 iOS 两大阵 ...

  3. Deno 中使用 @typescript/vfs 生成 DTS 文件

    背景 前段时间开源的 STC 工具,这是一个将 OpenApi 规范的 Swagger/Apifox 文档转换成代码的工具.可以在上一篇(<OpenApi(Swagger)快速转换成 TypeS ...

  4. 论文解读(WIND)《WIND: Weighting Instances Differentially for Model-Agnostic Domain Adaptation》

    Note:[ wechat:Y466551 | 可加勿骚扰,付费咨询 ] 论文信息 论文标题:WIND: Weighting Instances Differentially for Model-Ag ...

  5. plt.rcParams运行时修改全局配置参数

    plt.rcParams简单介绍 plt.rcParams即 "运行时配置参数"("runtime configuration parameters"),是运行 ...

  6. from itertools import groupby

    需求:期望由 a 得到 b 实现方法: from itertools import groupby a = [ {'name': 'a', 'value': 1}, {'name': 'b', 'va ...

  7. 制作一个内部的 zabbix-agent 快速部署脚本

    下载官方的基础 agent 部署包 官方地址:点击到达 curl -O https://cdn.zabbix.com/zabbix/binaries/stable/5.0/5.0.36/zabbix_ ...

  8. Microsoft Build 2021大会开始后,Develop Blog一系列更新

    .NET BLOG 发布.NET 6预览版4 https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-4/ 发布.NET MAUI ...

  9. .NET Core 实现Excel的导入导出

    目录 前言 NPOI简介 一.安装相对应的程序包 1.1.在 "管理NuGet程序包" 中的浏览搜索:"NPOI" 二.新建Excel帮助类 三.调用 3.1. ...

  10. Solution Set -「CF 1534」

    这 1+2? 「CF1534 A」Colour the Flag Link. 把 W / R 拉出来广搜,注意判断全空的情况. #include <bits/stdc++.h> using ...