C++函数参数丢失了部分地址

C++ function argument losing part of address

本文关键字:地址 函数 参数 C++      更新时间:2023-10-16

我在C++中的Win8x64驱动程序上遇到了一个非常奇怪的错误(?),导致系统崩溃。

bool funcA(typedef1 arg1, typedef2 arg2)
{
    funcB(arg1, arg2);
    return true;
}

void funcB(typedef1 arg1, typedef2 arg2)
{
    ...do something
    funcD(....)
    ....
}

背景信息:--我确实注意到司机似乎在代码的随机位置撞车,但并没有检查原因。-我在"funcD()"中做了一些更改,与崩溃无关。-我通过调试编译了二进制文件,并注意到(现在有好几次)它在"funcB"的开头崩溃了。

问题:问题出在"arg2"的地址上。正确的"arg2"地址位于调用"funcB"的"funcA"内部。但一旦进入"funcB","arg2"的地址就会被截断。

例如,arg2=0xffffe000'01ace148在"funcA"中,然后传递给调用"funcB"。但在"funcB"内部,它变为arg2=0x00000000'001ace148

我真的不知道这怎么会发生,所以欢迎任何建议!不认为我在下游"funcD"中的更改会导致这种情况,是吗?

编辑:

两个"typedef"都指向一些不同的结构。

请注意,"funcA"除了使用与它接收到的参数完全相同的参数直接调用"funcB"之外,什么都不做。"funcA"answers"funcB"都有相同的参数(不同的返回类型tho),但"funcA"接收参数的地址没有问题。

因此,问题很可能(或至少在表面上)是由WinDbg为这些函数设置断点引起的。

我测试了代码(编译的二进制文件),没有在WinDbg中设置任何断点,系统没有崩溃。我测试了调试和发布版本,两者都顺利通过。

为什么/怎么做?不知怎么的,WinDbg把地址搞砸了,或者WinDbg放大了一个隐藏的问题?有人有类似的经历,他们解决了?