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

时间:2013-11-21 19:39:09

标签: c++

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

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


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

背景资料: - 我确实注意到驱动程序似乎在代码的随机位置崩溃,但没有检查原因。 - 我在“funcD()”中进行了一些更改,与崩溃无关。 - 我用debug编译了二进制文件,并注意到(现在好几次)它在“funcB”的开头崩溃了。

问题: 问题在于“arg2”的地址。正确的“arg2”地址在“funcA”里面,它调用“funcB”。但是一旦进入“funcB”,“arg2”的地址就会被截断。

e.g。 arg2 = 0xffffe000'01ace148而在“funcA”中,然后传递给调用“funcB”。但在“funcB”中,它变为arg2 = 0x00000000'01ace148

我真的不知道这是怎么发生的,所以欢迎任何建议! 不要以为我对下游“funcD”的改变可能会导致这种情况,是吗?

编辑:

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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