Re: 取地址指令指向的位置包含断点,导致访问违规(access validation)
C/C++本地代码调试
取地址指令指向的位置包含断点,导致访问违规(access validation)
Abstr
2015-09-18, 11:52 上午
调试过程中,在特定地址下断后,触发access validation,
定位后发现情况如下
mov eax, [address_x]
jmp eax
在address_x位置包含了一个断点,这样跳转后地址肯定不对了,指令就乱序了。
我的问题是:
有没有什么方法可以识别出这样的行进行规避?
补充:
我确实是在代码的某一行有效行进行下断的。这行是函数末尾的大括号。
Re: 取地址指令指向的位置包含断点,导致访问违规(access validation)
格蠹老雷
2015-09-18, 20:37 下午
如何能重现你的问题?
Re: 取地址指令指向的位置包含断点,导致访问违规(access validation)
Abstr
2015-09-21, 16:43 下午
不好意思张老师,现在才回你。
我构造了一个简单的列子,在HelloWorld.exe:0x412d7d处的反汇编是
jmp DWORD PTR [edx*4+0x4136c0]
edx的值为0x10
实际上是从0x413700处取地址来跳转的。但是这个位置是有对应源码的,如果在这里下断,就会导致跳转到意料之外的地方(地址中裹夹了一个断点),本来是要跳转到0x412e9b的结果跳到了0x412ecc这个在程序中一般意味着“访问违规”。
请问下张老师,有没有什么好的办法规避掉这种情况。
我想了一个简单的方案,是不是可以在所有的取址跳转处下断,在断点命中时,判断取址位置是不是存在断点。
使用到的exe、pdb和源码我都打包在附件里面了,用的编译器是vs2005。
Re: 取地址指令指向的位置包含断点,导致访问违规(access validation)
Bombs
2015-09-22, 09:28 上午
看了半天才明白你要表达什么意思。简单点说是:
A地址处下了个软件断点,如果代码中有类似jmp dword ptr[ A ]的指令。会导致这条跳转指令跳错位置了!
你A地址处用硬件断点就行了。
再说了一般不可能有这种代码生成。A地址处有代码,就不会有jmp dword ptr[ A ]这种把代码当数据访问的。如果A处是数据的话。你想下数据访问断点就用硬件断点ba
Re: 取地址指令指向的位置包含断点,导致访问违规(access validation)
Abstr
2015-09-23, 17:20 下午
这种情况是我在实际代码中遇到的情况。一般是switch语句会出现这种代码生成
void foo()
{
switch(bar)
{
...
}
*}
在标*位置下断有几率触发上述问题。
硬件断点的数量有限,需求要求设置多个断点。
我找到一个方式规避:这种问题一般发生在函数末尾的“}”处,我设置断点的时候,把函数最后一行都屏蔽了。
Re: 取地址指令指向的位置包含断点,导致访问违规(access validation)
悬崖遛马
2015-10-20, 11:34 上午
个人觉得不太可能啊,除非ide有bug。
你不是在源代码里通过ide调试器gui,而是用bp设置的吧?
调试器会修改的肯定是指令地址,不应该是’内存‘地址啊