Win32 下的堆损坏;如何定位?

2024-01-09

我正在研究一个多线程正在损坏堆的 C++ 应用程序。定位这种损坏的常用工具似乎不适用。源代码的旧版本(18 个月前)表现出与最新版本相同的行为,因此这种情况已经存在很长时间了,只是没有引起注意;不利的一面是,源增量不能用于识别错误何时引入 - 有a lot存储库中的代码更改。

崩溃行为的提示是在该系统中生成吞吐量 - 数据的套接字传输被合并到内部表示中。我有一组测试数据,这些数据会定期导致应用程序异常(各个地方,各种原因 - 包括堆分配失败,因此:堆损坏)。

该行为似乎与 CPU 功率或内存带宽有关;每台机器的数量越多,就越容易崩溃。禁用超线程核心或双核核心可以降低(但不能消除)损坏率。这表明存在与时间相关的问题。

现在问题来了:
当它在轻量级调试环境下运行时(例如Visual Studio 98 / AKA MSVC6)堆损坏相当容易重现 - 十到十五分钟后就会出现可怕的失败和异常,例如alloc;在复杂的调试环境(Rational Purify、VS2008/MSVC9甚至 Microsoft Application Verifier)系统会受到内存速度限制并且不会崩溃(内存限制:CPU 未超过50%,磁盘灯不亮,程序运行得很快,盒子消耗1.3G2G 内存)。所以,我可以选择是能够重现问题(但无法识别原因)还是能够识别我无法重现的问题的原因。

我目前对下一步的最佳猜测是:

  1. 获取一个疯狂的 grunty 盒子(以替换当前的开发盒子:2Gb RAME6550 Core2 Duo);这将使得在强大的调试环境下运行时重现导致错误行为的崩溃成为可能;或者
  2. 重写运算符new and delete to use VirtualAlloc and VirtualProtect一旦内存使用完毕,将其标记为只读。运行在MSVC6并让操作系统捕获正在写入已释放内存的坏人。是的,这是绝望的迹象:到底是谁重写了new and delete?!我想知道这是否会使其像 Purify 等人那样慢。

而且,不:不能选择内置 Purify 仪器进行运输。

一位同事走过来问“Stack Overflow?我们现在有堆栈溢出吗?!?”

现在,问题是:如何找到堆损坏者?


更新:平衡new[] and delete[]似乎已经在解决问题上走了很长的路。该应用程序现在崩溃前运行时间不再是 15 分钟,而是大约两个小时。还没到那儿。还有进一步的建议吗?堆损坏仍然存在。

更新:Visual Studio 2008 下的发布版本似乎要好得多;目前的怀疑在于STL附带的实现VS98.


  1. 重现问题。Dr Watson将生成可能有助于进一步分析的转储。

我会注意到这一点,但我担心沃森博士只会在事后被绊倒,而不是在堆被踩踏时被绊倒。

另一种尝试可能是使用WinDebug作为一个调试工具,它是一个非常强大的同时也是轻量级的。

现在再次强调:在出现问题之前没有太大帮助。我想当场抓获破坏者。

也许这些工具至少可以让您将问题缩小到某个组件。

我不抱太大希望,但绝望的时刻需要...

并且您确定项目的所有组件都具有正确的运行时库设置(C/C++ tab,VS 6.0项目设置中的代码生成类别)?

不,我没有,明天我将花几个小时浏览工作区(其中有 58 个项目)并检查它们是否都已编译并与适当的标志链接。


Update: This took 30 seconds. Select all projects in the `Settings` dialog, and unselect until you find the project(s) that don't have the right settings (they all had the right settings).

我的第一选择是专用的堆工具,例如页堆程序 https://support.microsoft.com/en-us/kb/286470.

重写 new 和 delete 可能很有用,但这并不能捕获较低级别代码提交的分配。如果这是你想要的,最好绕道low-level alloc API使用 Microsoft Detours。

还进行健全性检查,例如:验证运行时库是否匹配(发布与调试、多线程与单线程、dll 与静态库)、查找错误删除(例如,删除应该删除的位置)使用),确保您没有混合和匹配您的分配。

还可以尝试有选择地关闭线程,看看问题何时/是否消失。

第一次异常发生时,调用堆栈等是什么样子的?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Win32 下的堆损坏;如何定位? 的相关文章

  • 使用索引避免迭代器失效,维护干净的接口

    我创建了一个MemoryManager
  • 运行时两个注册之间的简单注入器基于动态上下文的注入

    我有一个使用 Simple Injector 进行命令处理程序注册的中介应用程序 并且注入和处理程序均已设置并完美运行 class DoWashingCommandHandler IRequestHandler
  • 在宏中使用 # [重复]

    这个问题在这里已经有答案了 请解释一下代码 include
  • 用 C# 中的字典中的值替换字符串中的单词

    我有一个简单的dictionary像这样 var fruitDictionary new Dictionary
  • 错误 C2065:'cout':未声明的标识符

    我正在处理我的编程作业的 驱动程序 部分 但我不断收到这个荒谬的错误 错误 C2065 cout 未声明的标识符 我什至尝试过使用std cout但我收到另一个错误 IntelliSense 命名空间 std 没有成员 cout 当我宣布u
  • 将标准库添加到C++ eclipse项目中

    一个 非常 新手 C 问题 有没有办法自动将标准库添加到 C eclipse 项目中 我安装了 CDT 主要功能插件 您可以手动添加 STL 标头的路径路径和符号 gt 包含选项卡 http help eclipse org galileo
  • 如何将 QSerialPort 模块添加到 CMake 中?

    我想将 QSerialPort 模块添加到 CMake 中 根据我的理解 我需要将QT 串口添加到 pro中 我只想使用 CMake 所以我尝试编译简单的 CMake 文件 但有错误 QtCore 正在工作 qDebug 可以毫无问题地显示
  • Linux C++ 调试器

    我正在寻找完美的 Linux C 调试器 我不期望成功 但搜索应该提供丰富的信息 我是一个非常有能力的 gdb 用户 但 STL 和 Boost 很容易压垮我的调试技能 并不是说我无法深入了解数据结构的内部结构 而是它需要很长时间 我通常会
  • ASP.NET 中的 thread.sleep

    我正在为我的网站模拟彗星实时馈送协议 因此在我的控制器中我添加 while nothing new before timeout Thread Sleep 1000 但我注意到添加此功能后整个网站变慢了 调试后我得出结论 当我打电话时Thr
  • 持续运行的 C# 代码 - 服务还是单独的线程?

    我有一个 NET 4 Web 应用程序 它有 3 个关联的独立项目 DAL BAL 和 UI 我正在使用实体框架进行数据库交互 我有代码循环遍历一堆数据库数据 根据找到的内容调用方法 然后更新数据库 我希望这段代码一直运行 同时 我希望用户
  • Excel 2007 中的数值 - 底层 xml 文件中的表示与存储

    这个问题与 NET和OpenXml有关 我已经阅读了以下文章 它有很好的解释 但没有回答我的问题 Excel 2007 中数值的可视化与底层 xml 文件不一致 https stackoverflow com questions 58594
  • 内存不足异常

    我正在使用 C 和 asp net 开发一个网络应用程序 我一直收到内存不足的异常 该应用程序的作用是从数据源读取一堆记录 产品 可能是数百 数千 通过向导中的设置处理这些记录 然后使用处理的产品信息更新不同的数据源 虽然有多个 DB 类
  • 如何在Windows Azure上调用ffmpeg.exe转换音频文件?

    我在 Windows Azure 上运行 Web 角色来接收 AAC 音频文件 通过 base64 字符串上传 并将它们存储到 blob 中 现在效果很好 接下来 我还必须将它们转换为 MP3 并将 MP3 存储到 blob 中 我决定使用
  • 剥离 OLE 标头信息 (MS Access / SQL Server)

    我有一个 C 应用程序需要支持二进制数据库内容 图像等 当使用 MS Access 或 MS SQL Server 时 此数据被包装在 OLE 对象内 如何去除此 OLE 标头信息 请注意 我不能只查找特定标签的开头 因为内容可以是 png
  • RubyMine - 没有为项目配置 Ruby 解释器

    我进入 设置 Ruby SDK 和 Gems 然后选择C RailsInstaller Ruby1 9 3 bin ruby exe 它在右侧加载了一堆宝石 看起来它会起作用 我点击 确定 但仍然有糟糕的语法突出显示 并且它仍然认为它没有
  • 实体框架中的导航属性是什么

    我是实体框架的新手 当Visual Studio创建模型图时我们主要可以看到Entities Propertie和Navigation Properties这两个东西 那么这些Navigation Properties是什么 如何使用它们
  • PC 上 XNA 中的信箱和缩放

    有没有一种方法可以让我基本上以 1080p 或 720p 作为默认分辨率来开发 XNA 游戏 然后根据设置的分辨率将游戏中的所有内容缩放到适当的大小 而不必在每个 Sprite 中设置缩放因子Draw 方法 我的想法是 我可以基于 1080
  • 预览MouseMove 与 MouseMove

    我有相当多的 XAML 经验 但最近我注意到我的大多数同事都使用预览鼠标移动代替鼠标移动事件 我一直用鼠标移动它对我很有帮助 但我忍不住问我什么时候应该使用预览鼠标移动什么时候鼠标移动 有什么区别 各自有什么优点和缺点等等 PreviewM
  • 如何以一对一/零关系更新员工和身份用户

    我正在尝试更新员工记录 也想更新身份用户 如果我先单独更新身份用户 例如 UserManager Update user Context Entry employee State System Data Entity EntityState
  • Unity 错误“内部构建系统错误。后端退出,代码为 -1073740791。”摧毁/杀死了我的项目

    好吧 我可能在这里夸大了 但这是真的 当我开始打开它时 该项目由于错误 内部构建系统错误 后端退出 代码为 1073740791 而被破坏 应用程序 这个项目已经在Google Play上发布了 也许和设置有关 有人可以帮忙吗 完整错误 I

随机推荐

  • ggplot2,如何在函数内使用访问数据框元素?

    我正在尝试使用 ggplot2 创建绘图来标准化许多类似绘图的创建 假设您可以使用 theme stat 或 geom 以及 运算符来堆叠大量选项 那么如何将其包装在函数中呢 我想创建一个函数来绘制数据框的各个部分 例如 library g
  • 使用 new 关键字创建的 Spring bean (@Component) 中的自动装配

    我有两颗春豆 如下 Component A Scope prototype public class A extends TimerTask Autowired private CampaignDao campaignDao Autowir
  • 当单元格背景颜色发生变化时,是否可以在 Excel 中触发事件?

    正如标题所说 我试图在单元格更改背景颜色时发生一些事情 比如说从红色变为绿色 但是只有当用户更改单元格中的值时才会触发工作表的更改事件 是否有解决方法来完成我想做的事情 或者这是一项不可能完成的任务 No 如 这是不可能的 VBA 中没有可
  • 将 SFINAE 与通用 lambda 结合使用

    泛型 lambda 可以利用 替换失败不是错误 规则 例子 auto gL auto func auto param1 auto params gt enable if t lt is integral lt std decay t
  • Listview数据绑定导致formview数据丢失

    在我的代码中 通过 Formview 研究后 我需要调用 listview databind 这使得无法获取 Formview 数据 即使它们仍然出现在屏幕中 这是我的代码 protected void DemandeSearchFormV
  • 如何从 pandas 数据框中的每一列创建子图

    我有一个包含 36 列的数据框 df 这些列绘制在单个绘图图表上 并使用下面的代码以 html 格式显示 import plotly offline as py import plotly io as pio pio write html
  • Servlet 3.0 的构造函数依赖注入?

    从 Servlet 3 0 开始 可以通过编程方式注册 Servlet 实例javax servlet ServletContext addServlet 这个类还有一个createServlet分析一些注释并执行依赖注入的方法 我想如果我
  • 如何枚举 ui-router 中的注册状态?

    我想知道是否有办法在使用时列出所有注册状态用户界面路由器 https github com angular ui ui router 如果您查看文档 state get 对于最新版本的 ui router 您会注意到 不向函数传递任何参数应
  • 为什么 javascript typeof 总是返回“object”

    我哪里做错了 我会等待 Class 作为此代码的结果 但它不会 这是来自对象函数 Typeof 不是这样工作的 它只返回内置类型 你可以尝试 this constructor name Class 它将一直检查原型链 看看是否this或任何
  • Safari不派冰候选人

    在 Safari 中不起作用的示例 https github com Kurento kurento tutorial node tree master kurento one2many call https github com Kure
  • Common lisp、CFFI 和实例化 C 结构

    我已经在谷歌上搜索了大约 哦 三个小时 寻找这个 问题 的解决方案 我试图弄清楚如何使用 CFFI 在 lisp 中实例化 C 结构 我在 c 中有一个结构 struct cpVect cpFloat x y 简单吧 我已经自动生成了到此结
  • Python json.dumps() 将我的所有数据输出到一行中,但我希望每个条目都有一个新行

    我正在使用 Python 和一些 json 数据 我正在循环访问我的数据 都是字典 当我将循环值打印到控制台时 我每行得到 1 个字典 但是 当我使用 json dumps 执行同一行代码将对象转换为能够输出的字符串时 我会在字典中得到多行
  • 在 Xcode 中强制刷新代码签名

    在我们的环境中 我们跨多个项目和平台共享资源 为 iPhone 进行构建时 仅需要这些资源的子集 由于该子集仍然相当大 因此我们有一个清单文件列出了其中的内容 这限制了副本 我们有自己的 Python 脚本来执行复制 仅刷新已更改的文件 我
  • Discord.js - 如何编辑 message.embed() 语句?

    我正在执行 ping 命令 编码非常简单 但我完全不知道如何编辑我正在使用的嵌入 这是我的代码 我正在使用命令处理程序来解释exports run 语句 const Discord require discord js exports ru
  • 记住在整个网站上按下的选项卡

    我创建了自己的带有超链接和 div 的选项卡 我将它们放在侧边栏中 当单击超链接时 我在相关 div 上使用 jquery show 和 hide 它工作正常 但是 我希望在用户导航时在整个网站上记住最后单击的链接 选项卡 我怎样才能做到这
  • Jquery 单击事件 - 需要两次单击才能触发

    这可能非常简单 但我正在努力找出发生了什么 在 JS 小提琴上 http jsfiddle net 3hHAX http jsfiddle net 3hHAX 有两个链接输出到 打开视频模式 正如链接文本所示 这两个链接应该打开一个模型弹出
  • 在 R 中排列 3 维列联表以运行 Cochran-Mantel-Haenszel 分析?

    我正在尝试在 R 中运行 Mantel Haenszel 分析 以确定在考虑组内 诊断 比率时比例测试的比较是否仍然显着 此测试可在 stats 包中找到 library stats mantelhaen test x 读完一些书后 我发现
  • 如何从 Cython 调用 C-API 函数,例如 PyUnicode_READ_CHAR?

    我正在使用 Cython 来加速对字符串 unicode CPython 3 6 进行操作的函数 我如何调用 CPythonPy UCS4 val PyUnicode READ CHAR my string my index 来自我的 Cy
  • Android:MaterialButton 覆盖 Style 中的 textColor

    我想定义一个替代按钮样式 使用我的辅助颜色作为背景和 colorOnSecondary分别为文本 但我正在努力获取样式中定义的 textColor MaterialButton 使用 私有 选择器绘制作为 textColor 它使用 col
  • Win32 下的堆损坏;如何定位?

    我正在研究一个多线程正在损坏堆的 C 应用程序 定位这种损坏的常用工具似乎不适用 源代码的旧版本 18 个月前 表现出与最新版本相同的行为 因此这种情况已经存在很长时间了 只是没有引起注意 不利的一面是 源增量不能用于识别错误何时引入 有a