我在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”接收参数的地址没有问题。
答案 0 :(得分:0)
因此,问题很可能(或至少在表面上)由WinDbg设置断点到这些函数引起。
我测试了代码(已编译的二进制文件)而没有在WinDbg中设置任何断点,系统也没有崩溃。我测试了调试和发布版本,两者都没有问题。
为什么/怎么样?不知何故WinDbg搞砸了地址,或者WinDbg放大了一个深层隐藏的问题?任何人都有类似的经历,他们解决了?