ACCESS_VIOLATION_BAD_IP
时间:2020-03-06 14:41:47 来源:igfitidea点击:
我试图找出我的应用程序中的崩溃。
WinDbg告诉我以下内容:(使用破折号代替下划线)
最后控制权转移:从005f5c7e到6e697474
默认桶ID:BAD_IP
BUGCHECK-STR:访问违规
对我来说很明显6e697474不是有效的地址。
我有三个问题:
1)" BAD_IP"存储区ID是否表示"错误指令指针"?
2)这是一个多线程应用程序,因此需要考虑的是我试图调用其功能的对象超出了范围。有谁知道这是否会导致相同的错误消息?
3)还有什么可能导致这样的错误?我的一位同事建议说这可能是堆栈溢出的问题,但是在过去,WinDBG在检测和指出这些问题方面已经相当可靠。 (不是我确定它会在后台进行诊断的巫毒)。
解决方案
错误IP是错误指令指针。根据问题的描述,我认为这是堆栈损坏而不是堆栈溢出。
我可以想到以下几条可能导致跳转到无效地址的可能性,以降低可能性的顺序:
- 在已释放对象上调用成员函数。 (我们怀疑)
- 调用损坏对象的成员函数。
- 用损坏的vtable调用对象的成员函数。
- 胭脂指针覆盖代码空间。
我将通过在005f5c7e处找到代码并查看正在访问的对象开始调试。
问一下,什么可能将字符串" ttie"写到该位置?通常,当字节在0x41-0x5A,0x61-0x7A([a-zA-Z])范围内时,它指示字符串缓冲区溢出。
至于实际被覆盖的内容,可能是返回地址,我们正在使用的其他函数指针,或者有时对象中的虚拟函数表指针(vfptr
)被覆盖以指向字符串的中间。