前言
其实,这篇文章早在 2021 年就完成了初稿,后面一直没来得及完善(各种加班各种忙),所以一直没来得及整理发布。而且,我从这个案例里学到的东西太多了,很多内容并没有体现在本篇文章中,后续有机会一定会再写文章分享。话不多说,一起来看正文吧。
缘起
前一阵子,有朋友在微信上发了一段 windbg 的输出信息,大概内容如下:
This dump file has an exception of interest stored in it. The stored exception information can be accessed via .ecxr. (fd0.9bc): Security check failure or stack buffer overrun - code c0000409 (first/second chance not available) For analysis of this file, run !analyze -v
... 省略 N 行
看样子像栈相关的问题。于是简单跟朋友说了下我的猜想,有可能是栈破坏了。没想到,远不是这么简单。
说明: 之所以一定要写这篇总结,是因为我在分析过程中犯了很多想当然的错误,记录下来,以后不要再犯。
另有隐情
过了一会,朋友发了一段更贴近真相的错误提示,并且发送了更详细的语音描述。
FAILURE_ID_HASH_STRING: um:fail_fast_fatal_app_exit_c0000409_server.exe!std::_xbad_alloc
这个提示跟最开始的提示风马牛不相及。一个是栈相关的问题,一个是内存分配的问题。
说明: 经常分析转储文件的小伙伴儿应该都知道,直接打开转储文件时,
windbg给出的提示有可能是不准确的,如果想获取最准确的信息,最好通过.cxr切换上下文,然后再执行k系列命令查看。但是,很多时候直接执行!analayze -v就能拿到正确信息。正式分析之前,不妨先试试!analyze -v。
又跟朋友又聊了几个相关问题,得到了更多的关键信息。比如,
之前解决过类似的内存泄漏问题,当时抓的
dump有3GB多。这次抓取的
dump只有905MB,但是确实是full dump。说明: 内存相关问题,最好抓一个
full dump,否则分析到一半,由于转储文件缺少关键信息,没法继续确认,就太尴尬了。程序是
32位的,并且开启了大地址。说明:
64位程序的虚拟地址空间比32位程序大多了,不太容易在短时间内看出问题。前几次出问题时都是运行了很久才出问题,这次只运行了
7个小时左右就出问题了。几次出问题时,都是在内存比较紧张的时候。
聊了一会,问朋友是否方便发送完整的 !analyze -v 结果。没想到,朋友除了发送 !analyze -v 的分析结果外,还特别贴心的发送了 转储文件和对应的符号文件。必须为朋友点赞,看来没少分析转储文件。
查看分析结果
由于当时在北京出差的路上,于是在地铁里用手机查看了一下 !analyze -v 的分析结果(旁边的小哥哥小姐姐会不会以为我在看小说?),跟朋友说的一样,打开转储文件后,windbg 给出的错误提示确实是栈相关的,但是 !analyze -v 却指向了内存分配相关的问题。
这里简单摘录几个关键的信息:
转储文件中的
comment
Comment: '
*** "D:\software\Procdump_installer\procdump.exe" -accepteula -ma -j "D:\software\Procdump_installer\dumps" 4048 384 00990000
*** Just-In-Time debugger. PID: 4048 Event Handle: 384 JIT Context: .jdinfo 0x990000'
说明此 dump 是注册为 JIT debugger 的 procdump 在程序异常的时候抓取的。
运行环境
Windows 10 Version 14393 MP (2 procs) Free x86 compatible
Product: Server, suite: TerminalServer Data
内存碎片转储文件分析:一次难忘的经验

本文记录了一次分析内存碎片转储文件的过程,通过深入研究JVM内存泄漏问题,揭示了在Linux环境下,由内存碎片导致的分配失败。在分析过程中,使用了Windbg工具,揭示了错误提示的误导性,并通过查看堆信息、空闲块和内存区域,最终确认了问题源于严重的内存碎片化。
最低0.47元/天 解锁文章
838

被折叠的 条评论
为什么被折叠?



