问题标签 [memory-corruption]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 为什么这段代码会破坏内存?
这是一个相当新手的问题,应该可以很快得到回答......
基本上,在echo中第一次调用Printf后, args的内容已损坏。对我来说,这听起来像是我错误地传递了指针。但是想不通为什么?
注意这不是生产代码,只是概念证明。
编辑g_PlatformDevice 是 RiseWindows 类型,如果不清楚的话...
编辑这是在 vs2008 下运行的 windows xp 平台上
更新 对于任何有兴趣的人来说,问题似乎是调用堆栈溢出,在堆栈的更下方,然后定义了另一个大数组。重构这消除了内存损坏。所以粉笔成堆的殴打!
c# - PrintImage 导致损坏的内存错误
我在使用PrintImage
ActivePDF C# 库的功能时遇到问题。当我使用它尝试在 PDF 上放置 .gif 图像时,我收到以下错误消息:
尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
我可以毫无问题地使用PrintJPEG
和图像功能。PrintTIFF
有没有人遇到过这个问题?
c++ - Visual Studio 发布中令人费解的 STL 错误
我很确定这是 Visual Studio 2005 中优化器中的一个错误。问题出在 STL 映射上。
以下是相关代码:
在调试中完美运行,在发布时崩溃,并禁用全局优化“修复它”现在,没有任何效果。我得到一个:
这发生在最后一个 else if 的第一个 MyMapIterator::operator->
地图是空的,我知道 find 应该返回 end(),前两个比较有效。但不知何故,第三次 'myIt != m_myMap.end()' 返回 true,并执行 && 的右侧。
其他许多地方都像这样失败,'myIt!= m_myMap.end()' 的变体在同一个文件中返回 true,但对我来说,这是排除大多数其他可能性的地方。我曾经认为这是在我的地图上踩踏的缓冲区溢出,但回头看看代码。我很肯定没有其他线程在踩它,这是 100% 可复制的。
那么,我从这里做什么。这对性能一点也不敏感。我只需要它正常工作。任何选项都是可以接受的。是的,我知道我可以用迭代器相等性检查来包围整个事情,这不是最好的代码。关键是,它应该仍然有效,如果失败了,其他任何东西都可以。
编辑
最后一个 else-if 不会产生任何跳转!
delphi - FastMM4 说“块头已损坏”
我有这个讨厌的错误,过去消失了,但现在过了一段时间又回来了。
我创建了两个 TSam 对象(从 TPersistent 派生)并将其加载到一个 TAsmJob 对象(从 TObjectList 派生)。
在运行时,一个表单会创建一个 TStringGrid,然后是创建这两个 SAM 对象的 AsmJob(并在每个对象中从磁盘加载一些数据)。AsmJob 也分配给网格。当表单被销毁时,Grid 通过释放 AsmJob 来处理它,从而释放 TSam 对象。这是问题所在:第一个对象被释放而没有问题,但第二个对象在调用其继承方法(在 Destroy 析构函数中)时死亡。
我在整个程序中使用 FreeAndNil 来释放对象。TSam 对象不是 NIL !!!!!!因此,这是释放对象的第一次尝试。甚至对象内部的数据也是一致的。
该程序的主干如下所示:
我真的不明白我在哪里尝试双重释放或在对象被释放后覆盖它。
编辑:
我得到的一些错误:
FastMM 在空闲块扫描操作期间检测到错误。FastMM 检测到一个块在被释放后被修改。
FastMM 在空闲块扫描操作期间检测到错误。块头已损坏。
细节:
我在 IDE 中启用了所有“调试”选项,包括“范围检查”。此外,FastMM4 设置为超级积极的调试模式。如果没有 FastMM 或在调试器之外,程序运行得很好——但我知道这并不意味着错误不再存在。实际上,它(可能)工作了一年多,直到我安装了 FastMM。
编辑:
谢谢大家。不,我觉得我正在朝着好的方向前进。
程序的结构更复杂,我只提供了主干来保持原始帖子的小。但见鬼,它已经变大了 :) 所以,这些 TSam 对象用于从磁盘加载数据。每个对象中有一个文件。他们也在做一些处理和数据验证。对于这些 TSam 中的每一个,我还有一个图形对象,它在屏幕上(以图形方式)显示 TSam 对象中包含的数据。TStringGrid 中的每一行也以文本形式显示 TSam 中的数据。
我有一个问题:如果我将程序分成小块以找出错误所在,错误还会出现吗?或者它可能只出现在这个特定的配置中?
回答“如何将 AsmJob 分配给 TStringGrid,以便 TStringGrid 破坏 AsmJob,你能告诉我们吗?”
然后在 TForm.Create (保存网格的表单)的某个地方,我做
在 MyGrid 的析构函数中,我这样做:
visual-studio - 调试时 Visual Studio 2008 读取或写入受保护的内存
在全新的 Vista 机器上,每当我尝试在调试模式下启动项目时,我都会立即收到以下错误:
尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
我不购买消息中的“其他内存已损坏”部分。我认为该错误可能与我刚刚移至新机器的项目有关,但即使是全新的空白项目也表现出相同的行为。当我在不调试的情况下开始时,我没有收到任何消息。
我在网上阅读了一些修复方法:
- 2007 年有一个 .NET 2.0 的服务包解决了这些问题。我在 3.5 SP1 上,所以我怀疑这是问题所在。
- 为 x86 显式编译,因为您引用的 DLL 是 32 位的,您会遇到问题。我使用的是 Core 2 Duo,但运行的是 32 位 Vista,所以这应该不是问题,对吧?(另外,在测试项目中,没有 DLL。)
- 在调试下,取消选中“抑制模块加载时的 JIT 优化”。没有为我做任何事。
- 擦除整个操作系统并重新安装 VS2008。(这显然对孩子有用。)我现在没有时间。
我可能不需要调试就可以做我需要做的事情,但我肯定想把它拿回来。如果这里有人能想到为什么会发生这种情况,请告诉我。谢谢。
c - void 指针和 ffcall 库
我正在使用 ffcall(特别是 ffcall 的 avcall 包)库将参数动态推送到可变参数函数。即我们有
我们想用从用户那里获取的值来调用这个函数。为此,我们创建了该函数的 avcall 版本:
现在,我使用 avcall 的函数是:
它是这样使用的:
但是我想使用 avcall 从这个函数中捕获一定数量的值,我事先并不知道这些信息。所以我想我只是创建一个 void 指针数组,然后根据类型创建 malloc 空间:
而且av_read_row
只是:
我遇到了一堆内存损坏错误,似乎它不喜欢我在这里做的事情。我无法发现我这样做的方式有什么问题,你可以吗?av_read_row
目前,当我尝试在while 循环中释放 malloc 时,它不喜欢它。谁能看到我做错了什么,如果有的话?
谢谢
c - 摘要:malloc.c:3074 - 为什么这段代码会导致错误
运行时附加的下面的 C 代码给出了错误
在每次调用 malloc(21) 时;(见下文)。有人可以解释为什么吗?我已经尝试了我能想到的所有可能的事情,但仍然失败。
文件:summary.c
文件操作.c
编辑请考虑到这个代码是一个精简的版本,它被带到这里来显示问题。我已经删除了所有不相关的部分。
delphi - 在 Delphi 中检测 VMT 或堆损坏的正确工具是什么?
我是一个将 Delphi 2007 用于大型应用程序的团队的成员,我们怀疑堆损坏,因为有时会出现没有其他解释的奇怪错误。我相信编译器的 Rangechecking 选项仅适用于数组。我想要一个工具,当在应用程序未分配的内存地址上写入时,它会给出异常或日志。
问候
编辑:错误类型:
错误:模块“BoatLogisticsAMCAttracsServer.exe”中地址 00404E78 的访问冲突。读取地址 FFFFFFDD
EDIT2:感谢所有建议。不幸的是,我认为解决方案比这更深。由于我们拥有源代码,因此我们为 Delphi 使用了 Bold 的补丁版本。可能在 Bold 框架中引入了一些错误。是的,我们有一个日志,其中包含由 JCL 处理的调用堆栈以及跟踪消息。所以带有异常的调用栈可以像这样锁定:
内部异常部分是重新引发异常时的调用堆栈。
EDIT3:现在的理论是虚拟内存表(VMT)以某种方式损坏。当这种情况发生时,没有任何迹象。只有在调用方法时才会引发异常(始终在地址 FFFFFFDD,-35 十进制),但为时已晚。您不知道错误的真正原因。任何关于如何捕获这样的错误的提示都非常感谢!!!我们尝试过使用 SafeMM,但问题是即使使用 3 GB 标志,内存消耗也太高。所以现在我试着给 SO 社区一个赏金:)
EDIT4:一个提示是,根据日志,在此之前经常(甚至总是)另一个异常。例如,它可以是数据库中的乐观锁定。我们试图强制引发异常,但在测试环境中它工作正常。
EDIT5:故事还在继续……我现在对过去 30 天的日志进行了搜索。结果:
- “读取地址 FFFFFFDB” 0
- “读取地址 FFFFFFDC” 24
- “读取地址 FFFFFFDD” 270
- “读取地址 FFFFFFDE” 22
- “读取地址 FFFFFFDF” 7
- “读取地址 FFFFFFE0” 20
- “读取地址 FFFFFFE1” 0
所以目前的理论是一个枚举(有很多粗体)覆盖一个指针。我在上面得到了 5 个不同地址的点击。这可能意味着枚举包含 5 个值,其中第二个是最常用的。如果出现异常,则应为数据库进行回滚,并且应销毁 Boldobjects。也许不是所有东西都被破坏了,枚举仍然可以写入地址位置。如果这是真的,也许可以通过正则表达式搜索代码以查找具有 5 个值的枚举?
EDIT6:总而言之,还没有解决问题的方法。我意识到我可能会用调用堆栈误导你。是的,其中有一个计时器,但还有其他没有计时器的调用堆栈。对此感到抱歉。但有两个共同因素。
- 读取地址 FFFFFFxx 的异常。
- 调用堆栈的顶部是 System.TObject.InheritsFrom (sys\system.pas:9237)
这让我相信VilleK最能描述这个问题。我也确信问题出在 Bold 框架的某个地方。但最大的问题是,如何解决这样的问题?仅仅有一个像VilleK这样的断言是不够的,因为损坏已经发生并且调用堆栈在那一刻已经消失了。因此,描述我对可能导致错误的原因的看法:
- 某个地方的指针被分配了一个错误的值 1,但它也可以是 0、2、3 等。
- 一个对象被分配给该指针。
- 对象基类中有方法调用。这会导致方法 TObject.InheritsForm 被调用,并且地址 FFFFFFDD 上出现异常。
这 3 个事件可以在代码中一起使用,但也可以在以后使用。我认为这对于最后一个方法调用是正确的。
EDIT7:我们与 Bold Jan Norden 的作者密切合作,他最近在 Bold 框架中的 OCL 评估器中发现了一个错误。修复此问题后,这些异常减少了很多,但它们仍然偶尔会出现。但这是一个很大的安慰,这几乎解决了。
c++ - C++ vector push_back() overwrites on another vector of the same type?
I defined a class named nth_best_parse this way:
Then I declared vectors of this nth_best_parse as members of two different classes:
Then I run this program with gdb (by the way, I'm using Linux Ubuntu 9.04, g++ 4.3.3,GNU gdb 6.8-debian) and set a breakpoint at the end of the definition of compute_n_best_parses() with some conditions (to locate the exact call of this function I wanted, I was tracing back from a segmentation fault). When gdb hit the breakpoint, I issued a set of commands and the gdb output was like this:
Line 639 of BPCFGParser.cpp was like this:
This was a macro defined at the beginning of the file as:
By the way, class Traversal is defined as:
So actually I'm pushing something to the vector n_best_pairs_for_traversals, which is a member of an instance of the class BPCFGParser and the push_back() code somehow overwrites on the vector n_best_parses, which is a member of an instance of the class Edge. How can this ever be possible?
c - C中的字符串溢出检测
我们正在使用 DevPartners boundchecker 来检测内存泄漏问题。它做得很好,虽然它没有发现字符串溢出,如下所示
问题 1:他们有什么办法,我可以让 BoundsChecker 检测到这一点吗?
问题 2:他们是否有任何其他工具可以检测到此类问题?