Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调用指令中的偏移量已损坏_C++_C_Debugging_Visual C++_Corruption - Fatal编程技术网

C++ 调用指令中的偏移量已损坏

C++ 调用指令中的偏移量已损坏,c++,c,debugging,visual-c++,corruption,C++,C,Debugging,Visual C++,Corruption,过去几天一直在调试一个非常奇怪的问题。为i386构建的应用程序在Windows上运行时崩溃,调用堆栈的顶部完全损坏,指令指针位于无意义的位置 经过一番努力,我重新构建了调用堆栈,并能够确定IP如何最终位于无意义的位置。boost共享指针代码中的指令试图使用不正确的偏移量调用DLL导入地址表中定义的函数。说明如下所示: call dword ptr [nonsense offset into import address table] call dword ptr [ 0x50018254 ]

过去几天一直在调试一个非常奇怪的问题。为i386构建的应用程序在Windows上运行时崩溃,调用堆栈的顶部完全损坏,指令指针位于无意义的位置

经过一番努力,我重新构建了调用堆栈,并能够确定IP如何最终位于无意义的位置。boost共享指针代码中的指令试图使用不正确的偏移量调用DLL导入地址表中定义的函数。说明如下所示:

call dword ptr [nonsense offset into import address table]
call dword ptr [ 0x50018254 ]
结果,执行结果在一个错误的位置结束,不幸的是,该位置是可执行的。然后继续执行,吞噬堆栈顶部直到最终崩溃

通过在我的PC上启动相同的应用程序,并进入有问题的代码,我可以找到相同的调用指令,并通过调用msvc100的“新”操作员来查看它

进一步比较客户端PC和我的PC的迷你转储,我发现我的PC在地址表中调用了一个偏移量为0x0254的函数。在客户端PC上,代码试图调用偏移量为0x8254的函数

更令人困惑的是,这个偏移量不是来自寄存器或其他内存位置。在拆解过程中,偏移量是一个常量。因此,分解过程如下所示:

call dword ptr [nonsense offset into import address table]
call dword ptr [ 0x50018254 ]
不像:

call dword ptr [ edx ]

有人知道这是怎么发生的吗?

这是一个单位翻转:

0x0254 = 0b0000001001010100
0x8254 = 0b1000001001010100
也许是损坏的内存,损坏的磁盘,来自太阳的伽马射线


如果这个特定的案例是可复制的,并且它们的磁盘二进制文件与您的匹配,我会进一步调查。如果它不是特别可复制的,我建议客户运行一些机器诊断。

这是一个单位翻转:

0x0254 = 0b0000001001010100
0x8254 = 0b1000001001010100
也许是损坏的内存,损坏的磁盘,来自太阳的伽马射线


如果这个特定的案例是可复制的,并且它们的磁盘二进制文件与您的匹配,我会进一步调查。如果它不是特别可复制的,我建议客户端运行一些机器诊断。

在我看来,这肯定是硬件错误,主要是内存错误。正如@敌意_Fork所指出的,这只是一个小小的翻转


你的内存有ECC功能吗?如果成功,请确保已启用。我想用memtest86通过一个老化内存测试,看看会发生什么,我打赌你的内存芯片有故障,看起来不像是一个bug。

在我看来,这肯定是一个硬件错误,主要是内存错误。正如@敌意_Fork所指出的,这只是一个小小的翻转


你的内存有ECC功能吗?如果成功,请确保已启用。我想用memtest86通过一个老化内存测试,看看会发生什么,我敢打赌你的内存芯片有故障,看起来不像是一个bug。

我的一个同事在他的电脑上复制了一个看似相同的崩溃,然后就停止了。在那之前,我们也一直在想糟糕的记忆。我不是Windows如何加载DLL和填充call指令中使用的地址的专家,因此我不确定它是如何损坏的。我的一位同事在他的电脑上复制了一个看似相同的崩溃,然后就停止了。在那之前,我们也一直在想糟糕的记忆。我不是Windows如何加载DLL和填充call指令中使用的地址的专家,因此我不确定它是如何损坏的。您已经发现了ASLR,地址空间布局随机化。使恶意软件难以修补程序的功能。寻找这样一个问题的更典型的原因:堆栈缓冲区溢出破坏了堆栈帧并重写了返回地址。您已经发现了ASLR,地址空间布局随机化。使恶意软件难以修补程序的功能。寻找这样一个问题的更典型的原因:堆栈缓冲区溢出破坏了堆栈帧并重写了返回地址。