问题标签 [access-violation]
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# - 尝试读取或写入受保护的内存
我已经开始在我的应用程序的几个不同位置看到一个 AccessViolationException。它从未发生在我的开发电脑,我们的测试服务器上。它也只出现在我们的 2 台生产服务器中的 1 台上。因为它似乎只发生在我们的一台生产服务器上,所以我开始查看服务器上安装的 .net 框架版本。
我发现(出于某种奇怪的原因),有问题的生产服务器有 2.0 sp2、3.0 sp2 和 3.5 sp1,而另一台生产服务器和测试服务器有 2.0 sp1。
我的应用程序仅针对 2.0 框架,决定从生产服务器卸载所有框架版本并仅安装 2.0 sp1。到目前为止,我还无法重现该问题。很有意思。
Development pc: compact 2.0 sp2, compact 3.5, 2.0 sp2, 3.0 sp2, 3.5 sp1 Test server: 2.0 sp1 Production server1: 2.0 sp1 Production server2: 2.0 sp2, 3.0 sp2, 3.5 sp1
现在,为什么我不能重现这个问题我的开发电脑上面有 2.0 sp2,我不知道。我听说这种访问冲突可能发生在某些使用远程处理的软件上,我的就是这样做的,但是当远程处理实际发生时,访问冲突从未发生过。我现在只使用 2.0 sp1 没问题,但我真的很想知道是否有人遇到过这个问题,以及他们是否找到了新版本框架的解决方法。
以下是一些异常及其堆栈跟踪:
delphi - 为什么我的自定义组件会在 IDE 中引发 AV?
我正在尝试编写一个简单的组件,它允许您使用 SDL 1.3 API 在 Delphi 窗口中嵌入一个或多个 SDL 渲染表面。它可以很好地编译和安装,但是当我尝试在表单设计器中使用该组件时,每当我尝试在对象检查器中访问其属性、保存表单或删除组件并将其放置在然后尝试运行的表单会出现链接器错误:无论出于何种原因,它显然都无法正确读取 DFM。
DLL 可以在http://www.libsdl.org/tmp/SDL-1.3-dll.zip找到,我的组件的源代码可以在这里下载。SDL.pas 是 JEDI-SDL 头文件;其余的是我自己的代码。
我认为没有任何理由在表单设计器中提出 AV。如果我在运行时动态创建控件,我没有任何稳定性问题。任何人都可以看看这个,也许可以提供一些反馈来帮助我清理它?
null - 关于不可为空类型的争论
我不断听到人们谈论不可为空的引用类型如何解决如此多的错误并使编程变得如此容易。甚至 null 的创建者也称其为十亿美元的错误,并且Spec#引入了不可为 null 的类型来解决这个问题。
编辑:忽略我对 Spec# 的评论。我误解了它是如何工作的。
编辑2:我一定是在和错误的人说话,我真的希望有人与之争论:-)
所以我猜,作为少数派,我错了,但我不明白为什么这场辩论有任何价值。我认为 null 是一种查找错误的工具。考虑以下:
砰!访问冲突。有人忘记初始化了c
。
现在考虑一下:
哎呀。循环被静默地跳过。可能需要一段时间才能找到问题所在。
如果你的类是空的,那么代码无论如何都会失败。为什么不让系统告诉你(尽管有点粗鲁),而不必自己弄清楚呢?
.net - 从 .Net 访问 COM 对象时访问冲突
如果帖子太长,我很抱歉,但如果有人至少指出粗体标题,我会很高兴,并指出我正确的方向。我这几天遇到这个问题,但无法在网上找到答案。这些是我到目前为止发现的东西。
1.“访问冲突”异常崩溃了我的托管应用程序
我的 C# WinForms 应用程序有时会在 Windows 窗体 TabControl 中选择 TabPage 时以“访问冲突”异常(“尝试读取或写入受保护的内存”)关闭。从堆栈跟踪(在 Application.Run 周围尝试/捕获)我可以看到异常发生在System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
,在内部调用UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
。
2. 故障模块似乎是一个 COM 对象(ChartFX Client Server 6.2)
使用 WinDbg(加载了 SoS),我在 ChartFX.ClientServer.Core.dll(这是我们正在使用的 COM 图表组件)内部的非托管端捕获了它:
[编辑:]我也无法从 WinDbg 获得未管理的堆栈详细信息(它说“堆栈展开信息不可用”):
3、Bug 不易复现(虽然一般5分钟内就可以引发)
我在几个 TabPages 中有几个 Chart 实例,这通常发生在我切换选项卡时。我仍然不知道如何重现它,除了在它发生之前切换这些选项卡几分钟,所以我不能使用我们的源代码管理来可靠地找到没有这个问题的构建。我通过 VS 设计器自动创建的托管 AxChart 包装类(从 AxHost 派生)访问图表。
4. 我的下一步应该是什么?
如果有人能指出我应该采取的下一步行动来找到真正的原因,我将不胜感激。实验(删除和返回代码)并没有多大好处,因为我不知道如何重现它,所以每次迭代都需要大量时间才能说服自己该错误仍然存在。
我发现人们经常建议“切换编译器优化”之类的东西,但由于异常不是确定性地抛出的,我不想简单地重新排列一些字节并希望它永远不会返回。
delphi - AV 当使用来自一个组件的过程被另一个组件调用时
我不确定我是否已经尽我所能解释了这一点,但是,我们开始......
我在一个表单上有 2 个自定义组件,它们在设计时通过 IDE 链接在一起。每当我从组件中调用一个过程时,我都会遇到访问冲突,
模块“Project2.exe”中地址 0049A614 的访问冲突。读取地址 00000034。
这是我的代码的一小部分
和...
0049A614 在 *****,IDE 在这里停止。
我也尝试过在运行时进行分配
没有运气
使用 Presence1 或 MyClient1 中不相互依赖的程序可以正常工作。
德尔福 7
跟进:从 mghie 评论中,我重新考虑了它。
我从表单中删除了 TPresence 组件(这导致了一些奇怪的 IDE 错误,这可能与它有关)并在设计时创建了它,分配了所需的一切。现在它可以工作了,但是将 TPresence 组件放回 from 会带来错误。
谢谢你们的帮助,我现在应该可以解决这个问题了,如果我不能重新打开另一个问题:)
memory-management - 如何解决访问冲突写入位置错误?
我有一个简单的程序,但在*(str + start)
. 为什么?我应该可以改变它。正确的?
c# - Marshal.Copy 方法在 C#.NET 中引发 AccessViolationException
我正在开发一个可以显示来自相机的实时图像的 C# 应用程序。以下代码片段面临的问题是,当在线程中连续执行此函数时,我在 Marshal.Copy 中得到 AccessViolationException。但是,这在运行一次时会成功运行(我得到一个静态图像)。我想这与一些内存损坏问题有关。关于如何处理这个问题的任何想法/建议?
c# - P/Invoke 帮助期间的 AccessViolationException
从外部 DLL 调用以下内容时,我不断收到 AccessViolationException:
其中有一个我这样设置的原型:
现在,导致这种情况的参数很可能是第 5 个参数(IntPtr pMapping)。我已将此代码从 C++ 应用程序移植到 C#。上面的第 5 个参数是一个指向一个结构的指针,它还包含一个指向另一个结构的指针。以下是我如何设置这些结构:
这些的 C++ 等价物如下:
我觉得我在移植这些结构或移植函数原型时做错了。某种编组问题。
这篇文章顶部的函数在我的代码中被调用了两次。一旦 pMapping 设置为 null(这会将一个值放入“大小”中)。然后使用此大小参数为新结构分配内存,并且现在使用指向此分配内存空间的指针再次调用该函数以进行 pMapping。(pMapping 还有一个指向另一个结构的指针,该结构在此期间也分配了一些空间)。
这是完成此操作的旧 c++ 代码:
我最初认为我没有分配正确的空间量,所以我尝试了上面的旧 C++ 代码并发现:
我在我的 C# 代码中进行了相同的检查,发现以下内容:
我们这里有问题。Mapping 结构的大小应该是 272,但它只有 16。我想我可以做一个快速修复,我在这里手动分配了 272 而不是 16,但它仍然出错,并出现 AccessViolationException。
关于如何解决这个问题的任何想法?或者还有什么问题?
c# - 需要帮助从 .NET JITted 代码中破译一行汇编代码
在 C# 构造函数中,最终调用this(...)
,实际调用被转换为:
这里的 DS 寄存器内容是什么?我知道这是数据段,但是这个调用是通过 VMT 表还是类似的?不过我对此表示怀疑,因为this(...)
不会调用虚拟方法,而只是调用另一个构造函数。
我问是因为该位置的值在某种程度上似乎很糟糕,如果我按 F11,跟踪到(Visual Studio 2008),在该调用指令上,程序会因访问冲突而崩溃。
该代码位于第 3 方控件库的深处,虽然我有源代码,但我没有使用足够的调试信息编译的程序集,我可以通过 C# 代码跟踪它,只能通过反汇编程序,然后我有将其与实际代码相匹配。
有问题的 C# 代码是这样的:
Reflector 向我展示了这个 IL 代码:
正是最后一次调用同一类的另一个构造函数失败了。调试器永远不会出现在其他方法中,它只会崩溃。
JITting之后的方法反汇编是这样的:
基本上我要问的是:
ds:[ADDR]
这里间接的目的是什么?VMT-table 仅用于虚拟不是吗?这是构造函数- 构造函数是否还没有被 JITted,这可能意味着调用实际上会通过 JIT shim 调用?恐怕我在这里深陷困境,所以任何事情都可能而且可能会有所帮助。
编辑:嗯,问题只是变得更糟,或者更好,或者其他什么。
我们正在 Visual Studio 2008 解决方案中的 C# 项目中开发 .NET 功能,并通过 Visual Studio 进行调试和开发。
但是,最终,此代码将加载到由 Win32 Delphi 应用程序托管的 .NET 运行时中。
为了方便对这些功能进行实验,我们还可以配置Visual Studio项目/解决方案/调试器,将生成的dll复制到Delphi应用程序的目录,然后通过Visual Studio调试器执行Delphi应用程序。
事实证明,如果我在调试器之外运行程序,问题就会消失,但在调试期间,它每次都会出现。
不确定这是否有帮助,但由于代码不会在另外 6 个月左右的时间内用于生产发布,因此我们很快就会为测试发布减轻一些压力。
稍后我将深入研究内存部分,但可能要到周末,然后发布后续内容。
delphi - 读取任意内存位置?可能的?
有没有办法(只读)访问任意内存位置而不会遇到访问冲突?我认为每个进程都有自己的虚拟地址空间,并且它可以读取所有可用的内存位置......似乎并非如此,因为如果我执行类似的操作,我的程序就会挂起
我仍在尝试编写我的低级递归大小函数并尝试检测数据成员是否是对象引用。
谢谢!