访问违规阅读位置

时间:2013-08-16 12:58:56

标签: c++ visual-studio visual-c++ arm

我正在尝试在MSVS 2010上调试该项目。 实现 - c ++;当我对源代码进行脱毛时,我得到了MSVS报告的以下失败。

报告失败:

"First chance exception at 0x00000013fb5b9ee in unit.exe: 0xc00000005 access voilation reading location 0x00000000000000c."

问题在于获得地址。

int base = (*(abc::g_runc1.m_paulsenderpin.m_lastchunk_p)).xcpp::cxcppoutput::m_baseaddress;

我的项目非常大,包含源代码

简而言之,它可以描述为:   - paul是一个模块,发送方引脚连接到c1。   - xcpp是接口

这个源代码和项目是正确的,并且在ARM编译器上运行没有失败,但在MSVS上它提供了访问冲突错误。 在msdn上有一些关于程序集设置权限的帖子,它们可以避免读取所寻址的位置。如果是的话,如何改变它? 还是有更好的选择来找到问题......?

感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

您的代码正在尝试访问实际上不属于其进程的位置。用户应用程序的数据不能位于如此接近零的地址。由于您的表达式太长而无法简单地找到包含零引用的成员,我的提示为m_last chunk_p,而m_baseaddress似乎是偏移12处的成员。

有一个简单的解释为什么你的代码在与ARM一起工作的代码编译时工作正常:ARM使用对齐的内存访问,因此类和结构成员与完整的块对齐,尽管它们并不总是使用整个空间分配给他们。因此,在代码中的某处使用更大的指针或错误的memset参数,并且指针会被覆盖。

当您使用其他版本的(可能是另一个)编译器(或具有不同处理器架构32/64的非机器)编译它时问题也可能消失,因为基本类型的大小并不总是相同。

您应该尝试检查表达式中指向的实际上是零(或可能是12)并尝试在其上设置监视。请务必在任何地方正确使用sizeof

答案 1 :(得分:0)

问题在于内存寻址,ARM调试器32位和MSVS10 48位寻址,因为MSB字节丢失,因此无法找到正确的内存地址...... !!!