C++:XY.exe 中 0x0b9ec715 (XX.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000004

Posted

技术标签:

【中文标题】C++:XY.exe 中 0x0b9ec715 (XX.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000004【英文标题】:C++: Unhandled exception at 0x0b9ec715 (XX.dll) in XY.exe: 0xC0000005: Access violation reading location 0x00000004 【发布时间】:2011-03-22 12:51:11 【问题描述】:

如何调试上述错误?我在 Microsoft Visual Studio 中使用 C++。

以下是部分代码:

HDC dc =*mMemDC;
X->SelectPalette(dc);

当我调试代码时,它在X->selectPallete(dc); 行崩溃

【问题讨论】:

X 为空?你的SelectPalette 在做什么?也许它的参数的默认值中有一些东西? 启动调试器,启用Debug>Exceptions>Win32 Exceptions下的C0000005异常捕获,看看哪里出了问题?环顾四周,可选装配Go To Assembly。你有什么问题? 完全重复:***.com/questions/3359696/…。请不要重复同样的问题! 我启用了该异常。接下来呢?我的问题是->当我从窗口单击工具栏图标时,要打开的预期窗口崩溃。第一次打开时,我关闭然后单击图标 agan,它崩溃说错误。调试时它显示在上述线 SelectPallete() 方法有这个。 SelectPallet(HDC hdc) ::SelectPalette(hdc, Palette, FALSE);实现调色板(hdc);里面的两个方法都是windows api的 【参考方案1】:

X->SelectPalette(dc); 处设置断点。检查X。如果它看起来不像是一个有效的指针(即在这种情况下是0x0b9ec715 周围的地址)或者是0,那么它肯定是一个坏指针。还要提供更多代码,因为您提供的内容并不能真正回答任何问题。

【讨论】:

它不太可能是 4,通常它为空,并且问题发生了,不仅仅是因为您在空指针上调用成员函数 - 这本身就很好 - 而是因为该函数尝试访问 X 类中偏移量为 4 的成员。因此:NULL + 4 = 4 @matt,很有趣——但为什么会是 4?不应该是类实例的地址+ 4吗?如果 X 为 NULL,那么异常中的读取位置应该是 0,对吧? 我无法在 x->SelectPalete(dc) 行中放置断点,因为这条线在 WM_PAINT 方法内。如果我放置断点,它会继续落在 WM_PAINT 消息中。注意:当我单击工具栏中的图标时,它必须打开一个窗口,第一次它很好,第二次,即我关闭我打开的窗口,然后再次单击该图标。然后在指定时崩溃行 那么第一次遇到断点会发生什么? X 的值是多少?如果你可以得到 VS 窗口并且你的目标窗口并排,你可以在每次它到达断点时点击继续,最终它会解决。 这个VS窗口是什么?请告诉。断点将如何解决【参考方案2】:

使用调试器检查 mMemDC 和 X 中的值是什么。内存地址 0x0b9ec715 的某些代码试图读取 0x00000004 无效位置的内存。 0xC0000005 是在尝试读取无效位置的内存时表示错误的代码。

此外,您可能会在此处获得一些关于具有奇怪内存“地址”的其他异常的一些想法:http://blog.sina.com.cn/s/blog_598c00790100a6a0.html

【讨论】:

有时我会在同一行中收到此错误。 “运行时检查失败 #0 - ESP 的值未在函数调用中正确保存。这通常是调用使用一种调用约定声明的函数和使用不同调用约定声明的函数指针的结果。”我检查了,mMemDC 和 X 的值不是 NULL 如果值不为 NULL,它们是什么?我们都在努力为您提供帮助,所以请详细说明。从您提供的最新信息来看,您的代码中似乎存在错误。仅供参考,“ESP”是“扩展堆栈指针”(一个 32 位值,而不是一个 16 位值的“SP”)。我认为您应该发布更多代码,尤其是您从 DLL 导出的代码和 EXE 中的导入代码。另外,您在应用中是否使用了任何多线程或计时器? 听起来你有一个未初始化的指针。请发布初始化 X 的代码。 初始化 X 如下 X = StaticX::CreateX(Frme);和 createX 方法在 X* StaticX::CreateX(HWND hwnd) StaticUseCount++;删除静态_X; return (Static_X = new StaticX(hwnd));我试过调试,X 不为空,它是一个有效的指针。假设在 X->SelectPallete(dc) 行之前,如果我添加调用属于 X 的任何方法,即 X->GetBkgColor();,所以在调试时,这一行永远不会出现任何问题,只有当我到达下一行时,即 X ->selectPallete(dc),它抛出异常。请注意:此错误是随机出现的。并非每次崩溃时都会调用堆栈:

以上是关于C++:XY.exe 中 0x0b9ec715 (XX.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000004的主要内容,如果未能解决你的问题,请参考以下文章

C++ Primer 0x0B 学习笔记

堆栈展开真的需要锁吗?

来自垂死的多线程进程的核心转储

C++ Prime 0x0A 练习题解

C++ Prime 0x0C 学习笔记

C++ Prime 0x0C 练习题解