首页/新闻资讯/正文详情

用 DrMemory 检测 SumatraPDF 内存错误与 Windows API 误用:配置、抑制与实战指南

发布时间:2026/9/21 2:11:45 来源:云帆数科 栏目:资讯中心
用 DrMemory 检测 SumatraPDF 内存错误与 Windows API 误用:配置、抑制与实战指南
用 DrMemory 检测 SumatraPDF 内存错误与 Windows API 误用配置、抑制与实战指南【免费下载链接】sumatrapdfSumatraPDF reader项目地址: https://gitcode.com/gh_mirrors/su/sumatrapdfDrMemory 是一款专门用于检测内存错误和 Windows API 误用的动态分析工具本文基于 SumatraPDF 开源仓库中 docs/md/Using-DrMemory.md 的真实实践记录展开完整还原开发者用 DrMemory 1.8.1 检查 SumatraPDF.exe 的完整流程——包括环境约束、命令行参数、日志目录与抑制文件suppression的编写方法。读完本文你将掌握如何为 SumatraPDF或其他 32 位 Windows 原生程序搭建 DrMemory 检测环境、如何区分真实缺陷与误报、如何通过drmem-sup.txt抑制已知误报并了解该工具在本次实践中的性能与稳定性局限。DrMemory 能做什么、为什么适合 SumatraPDFSumatraPDF 是一个体量庞大的 Windows 原生 C 程序源码集中在 src 目录其中 src/base 存放基础工具代码它直接操纵 GDI、COM、文件 I/O 与各种文档解析引擎内存错误和 Windows API 误用的风险点非常多。DrMemory 的核心能力正是针对这两类问题内存错误检测越界读写、释放后使用use-after-free、未初始化读取、内存泄漏、句柄泄漏等Windows API 误用检测非法参数、错误的返回值处理、违反 Windows 调用约定的用法。在 SumatraPDF 的开发流程中DrMemory 被作为与编译器静态分析、AddressSanitizerASan 并列的动态检测手段前者在运行时实跑程序并拦截错误后者在构建期插入检测代码。从源码结构看仓库中 src/base/Win.cpp 的GetMeasurementSystem()函数特意标注了// this triggers drmemory. Force no inlining so that its easy to write a localized suppression并使用__declspec(noinline)强制禁止内联——这正是为了让 DrMemory 的告警栈保持稳定、便于为单个函数编写精确抑制。这个细节说明项目开发者把 DrMemory 的抑制机制suppression当成了日常工作流的一部分而不仅是偶尔跑一次的工具。环境与版本约束先确认你能不能用原文档明确记录了实践时的环境这是使用 DrMemory 时必须遵守的硬性前提工具版本便携版portable1.8.1 RC1操作系统32 位 Windows 7重要限制该版本不支持 Windows 10也不支持 64 位 Windows。也就是说若你的开发机是 64 位 Windows 10/11这一版 DrMemory 无法直接运行。这决定了 SumatraPDF 侧的配合方式需要准备一个32 位Win32构建产物。从仓库当前的构建脚本 cmd/build.ts 可以看到Windows 构建输出目录按平台与配置区分rel3232 位 Release、rel6464 位 Release、dbg6464 位 Debug、prf64Profile对应out/下的同名目录。原文档命令行中的.\rel\SumatraPDF.exe就是旧版构建布局下 32 位 Release 产物的典型路径在今天等价产物位于out/rel32/SumatraPDF.exe。构建方式可参考 docs/md/Build-system.mdbun cmd/build.ts系列命令。完整实操准备日志目录、启动检测原文档给出了两条核心命令这里逐条展开并补充注释。1. 创建日志输出目录mkdir ..\drmemlogsDrMemory 默认会把检测报告写入日志目录建议与 SumatraPDF 可执行文件所在目录分开存放。原实践把日志目录放在仓库目录之外..\drmemlogs这样检测产生的大量日志不会污染源码树也便于整目录清理。2. 以受检方式启动 SumatraPDF..\drmemory\bin\drmemory.exe -logdir ..\drmemlogs -suppressdrmem-sup.txt — .\rel\SumatraPDF.exe ..\f1.pdf各段含义如下参数作用..\drmemory\bin\drmemory.exe便携版 DrMemory 的可执行文件路径按实际解压位置调整-logdir ..\drmemlogs指定检测日志与报告的存放目录-suppressdrmem-sup.txt指定抑制文件用于过滤已确认的误报—长破折号分隔符之后的参数全部传给被检测程序.\rel\SumatraPDF.exe被检测的目标程序32 位 Release 构建..\f1.pdf作为命令行参数传给 SumatraPDF 的测试文档需要特别说明命令行中的长破折号—U2014在原文档中是这样出现的实际书写时建议使用标准的分隔形式如--或直接将被检测程序放在-suppress参数之后以避免复制时出错。..\f1.pdf是一个用于复现问题的测试 PDF——检测通常带有目的性打开一个会触发崩溃或内存告警的具体文件比泛泛地跑一遍程序更有价值。检测过程中 DrMemory 会以慢速回放方式执行程序每一次内存访问都被拦截检查因此程序运行会明显变慢这是预期现象而非故障。检测结束程序退出或被终止后日志目录中会生成对应进程的报告其中列出 DrMemory 发现的内存错误与 API 误用并给出触发时的调用栈。处理误报维护drmem-sup.txt抑制文件动态内存检测工具在真实的大型 Windows 程序上几乎必然产生假阳性——原文档明确记录There are some apparent false positives.存在一些明显的误报。DrMemory 的告警栈中误报通常来自系统 DLL 内部的已知模式、第三方库的特定用法或是经过精心构造的合法代码例如上面的GetMeasurementSystem()场景。处理策略不是改代码而是把已确认的误报写入抑制文件让后续检测自动跳过这些告警运行检测收集全部告警逐个甄别能从代码逻辑证明是误报的记录到drmem-sup.txt再次运行检测确认剩余告警都是需要处理的真实问题。仓库中虽然没有现成的drmem-sup.txt但根目录下的 asan.supp 展示了同类抑制文件的实际写法——它是为 ASan 准备的抑制列表全部条目采用interceptor_via_lib:/interceptor_via_fun:前缀按库名或函数名精确归类如interceptor_via_lib:ucrtbase.dll、interceptor_via_fun:RegenerateUserEnvironment。DrMemory 抑制文件遵循类似的按模块/函数/调用栈特征匹配思路通常是逐条列出报告 ID 与匹配规则。你可以把 asan.supp 当作理解抑制机制的现成参照物。对应到源码层面src/base/Win.cpp 中GetMeasurementSystem()的__declspec(noinline)注释直接点名this triggers drmemory表明该函数会触发 DrMemory 告警很可能是GetLocaleInfoW这类系统调用与内部缓冲区交互的模式被误判因此刻意禁止内联保证告警调用栈稳定可匹配从而easy to write a localized suppression便于编写局部抑制。这是源码配合抑制文件的典型范例抑制不是掩盖问题而是把已知无罪的模式明确标记出来让检测聚焦在真正可疑的代码上。已知局限慢、而且 DrMemory 自己也会崩原文档如实记录了两点使用体验作为实践前必须知悉的限制明显拖慢程序如前所述全量内存拦截使程序运行显著变慢因此 DrMemory 适合在复现特定问题、短会话场景下使用不适合作为日常长时间运行的监控手段DrMemory 自身偶尔崩溃作者记录到it crashed for me with XPS files——在处理 XPS 文档时 DrMemory 本身发生崩溃。这意味着如果被测文件类型触发其自身缺陷需要更换测试文件或改用它法而不能据此断定被测程序有问题。换句话说DrMemory 的检测结果是工具视角的证据需要结合源码排查与人工复核不能无条件全盘采信。与其他内存检测手段的配合在 SumatraPDF 仓库中DrMemory 只是内存健康保障体系的一环若受版本限制无法使用如 64 位 Windows可参考仓库内的替代方案AddressSanitizerASan仓库构建体系 premake5.lua 与 cmd/build.ts 提供x64_asan平台64 位专用构建产物为out/dbg64_asan/SumatraPDF-static.exe运行时需随带clang_rt.asan_dynamic-x86_64.dll。其抑制文件 asan.supp 已在仓库中随附详见 docs/md/Build-system.md调试器手工排查崩溃与挂起问题可走 docs/md/Debugging-Sumatra.md 的 WinDbg 流程!analyze -v、~*kb等覆盖率工具docs/md/Using-OpenCppCoverage.md 展示了用 OpenCppCoverage 分析同一类原生代码的做法可与动态检测互补。小结DrMemory 实战要点围绕 SumatraPDF 的这份实践记录可提炼出以下可直接复用的操作清单核对环境确认 DrMemory 1.8.1 仅支持 32 位 Windows不支持 Win10/64 位并准备对应的 32 位 SumatraPDF 构建今日路径为out/rel32/SumatraPDF.exe准备目录与文件mkdir ..\drmemlogs建日志目录drmem-sup.txt用于累积抑制规则执行检测drmemory.exe -logdir ..\drmemlogs -suppressdrmem-sup.txt 目标exe 测试文档用具体文档触发问题场景甄别告警结合 src/base/Win.cpp 这类源码证据区分真缺陷与误报误报写入抑制文件可参考 asan.supp 的按库/按函数归类思路接受局限运行显著变慢、工具偶发自崩如 XPS 场景结果需人工复核必要时切换到x64_asan构建或 WinDbg 调试流程。这套动态检测 抑制文件 源码交叉验证的组合拳正是大型 Windows 原生应用在发布前排查内存问题时可复制的标准姿势。【免费下载链接】sumatrapdfSumatraPDF reader项目地址: https://gitcode.com/gh_mirrors/su/sumatrapdf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

Windows与Linux虚拟机文件交换方案全解析:从拖拽到共享文件夹
Windows与Linux虚拟机文件交换方案全解析:从拖拽到共享文件夹

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/21 2:11:45

ccusage 仓库中使用 ast-grep 进行结构化代码检索:从 `run --pattern` 到关系规则与 `--debug-query`
ccusage 仓库中使用 ast-grep 进行结构化代码检索:从 `run --pattern` 到关系规则与 `--debug-query`

ccusage 仓库中使用 ast-grep 进行结构化代码检索:从 run --pattern 到关系规则与 --debug-query 【免费下载链接】ccusage npx ccusage 项目地址: https://gitcode.com/gh_mirrors/cc/ccusage 本篇指南以 ccusage 仓库内的 .agents/skills/ast-grep/SKILL.m… · 2026/9/21 2:11:45

用 FLOW Leverage 阶段 Backlink Competition Prompt 构建证据导向的外链竞争分析交付物
用 FLOW Leverage 阶段 Backlink Competition Prompt 构建证据导向的外链竞争分析交付物

用 FLOW Leverage 阶段 Backlink Competition Prompt 构建证据导向的外链竞争分析交付物 【免费下载链接】claude-seo Universal SEO skill for Claude Code. 25 sub-skills 18 sub-agents covering technical SEO, E-E-A-T, schema, GEO/AEO, backlinks, local SEO, maps int… · 2026/9/21 2:11:45

url_launcher_macos 深度解析:Flutter 官方 macOS URL 启动插件的实现原理与演进史
url_launcher_macos 深度解析:Flutter 官方 macOS URL 启动插件的实现原理与演进史

移动开发跨平台 【免费下载链接】plugins Plugins for Flutter maintained by the Flutter team 项目地址: https://gitcode.com/gh_mirrors/pl/plugins 点击查看 免费下载 导读 url_launcher_macos 是 Flutter 官方维护的 url_launcher 插件在 macOS 平台上的官方… · 2026/9/21 2:51:53

STM32 HardFault深度解析:寄存器快照与堆栈回溯实战指南
STM32 HardFault深度解析:寄存器快照与堆栈回溯实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/21 2:51:53

file_selector_ios:Flutter 官方 iOS 文件选择器插件的架构、UTI 过滤与实战指南
file_selector_ios:Flutter 官方 iOS 文件选择器插件的架构、UTI 过滤与实战指南

移动开发跨平台 【免费下载链接】plugins Plugins for Flutter maintained by the Flutter team 项目地址: https://gitcode.com/gh_mirrors/pl/plugins 点击查看 免费下载 导读 本文围绕 Flutter 团队维护的联邦插件体系中的 iOS 端实现 file_selector_ios 展开&… · 2026/9/21 2:51:53

多模块Maven项目JaCoCo覆盖率聚合的5类典型坑与排查指南
多模块Maven项目JaCoCo覆盖率聚合的5类典型坑与排查指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/21 2:51:53

用 gatsby-plugin-schema-snapshot 锁定 Gatsby GraphQL Schema:快照生成、类型重建与确定性构建指南
用 gatsby-plugin-schema-snapshot 锁定 Gatsby GraphQL Schema:快照生成、类型重建与确定性构建指南

前端静态站点Web框架 【免费下载链接】gatsby React-based framework with performance, scalability, and security built in. 项目地址: https://gitcode.com/gh_mirrors/ga/gatsby 点击查看 免费下载 gatsby-plugin-schema-snapshot 是 Gatsby 官方提供的 schem… · 2026/9/21 2:51:53

研发管理系统选型指南:跨部门协同流程梳理与POC验收清单
研发管理系统选型指南:跨部门协同流程梳理与POC验收清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/21 2:50:53

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化
Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡… · 2026/9/21 0:02:39

Word表格编号全攻略:从列表编号到题注交叉引用
Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技… · 2026/9/21 0:02:39

从第一个站到第二个站:独立开发者的静态网站选型与落地实践
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&… · 2026/9/20 0:00:41

Claude Code 按智谱AI指南装完,ANTHROPIC_BASE_URL 改走 TaoToken 兼容通道行不行
Claude Code 按智谱AI指南装完,ANTHROPIC_BASE_URL 改走 TaoToken 兼容通道行不行

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/21 0:00:18

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程
agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and … · 2026/9/21 0:00:18

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,… · 2026/9/21 0:00:18

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码