Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

C/C++本地代码调试

帖子发起人: Abstr   发起时间: 2015-09-18 11:52 上午   回复: 5

Print Search
帖子排序:    
   2015-09-18, 11:52 上午
Abstr 离线,最后访问时间: 2016/10/9 8:03:06 Abstr

发帖数前50位
注册: 2014-11-05
发 贴: 22
取地址指令指向的位置包含断点,导致访问违规(access validation)
Reply Quote
调试过程中,在特定地址下断后,触发access validation,
定位后发现情况如下
mov eax, [address_x]
jmp eax
在address_x位置包含了一个断点,这样跳转后地址肯定不对了,指令就乱序了。
我的问题是:
有没有什么方法可以识别出这样的行进行规避?
补充:
我确实是在代码的某一行有效行进行下断的。这行是函数末尾的大括号。

IP 地址: 已记录   报告
   2015-09-18, 20:37 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 取地址指令指向的位置包含断点,导致访问违规(access validation)
Reply Quote
如何能重现你的问题?
IP 地址: 已记录   报告
   2015-09-21, 16:43 下午
Abstr 离线,最后访问时间: 2016/10/9 8:03:06 Abstr

发帖数前50位
注册: 2014-11-05
发 贴: 22
Re: 取地址指令指向的位置包含断点,导致访问违规(access validation)

附件: foo.zip
Reply Quote
不好意思张老师,现在才回你。
    我构造了一个简单的列子,在HelloWorld.exe:0x412d7d处的反汇编是
jmp DWORD PTR [edx*4+0x4136c0]
edx的值为0x10
实际上是从0x413700处取地址来跳转的。但是这个位置是有对应源码的,如果在这里下断,就会导致跳转到意料之外的地方(地址中裹夹了一个断点),本来是要跳转到0x412e9b的结果跳到了0x412ecc这个在程序中一般意味着“访问违规”。
请问下张老师,有没有什么好的办法规避掉这种情况。
我想了一个简单的方案,是不是可以在所有的取址跳转处下断,在断点命中时,判断取址位置是不是存在断点。
使用到的exe、pdb和源码我都打包在附件里面了,用的编译器是vs2005。

IP 地址: 已记录   报告
   2015-09-22, 09:28 上午
Bombs 离线,最后访问时间: 2015/7/6 5:16:30 Bombs

发帖数前75位
注册: 2014-01-16
发 贴: 15
Re: 取地址指令指向的位置包含断点,导致访问违规(access validation)
Reply Quote
看了半天才明白你要表达什么意思。简单点说是:
A地址处下了个软件断点,如果代码中有类似jmp dword ptr[ A ]的指令。会导致这条跳转指令跳错位置了!
你A地址处用硬件断点就行了。

再说了一般不可能有这种代码生成。A地址处有代码,就不会有jmp dword ptr[ A ]这种把代码当数据访问的。如果A处是数据的话。你想下数据访问断点就用硬件断点ba

IP 地址: 已记录   报告
   2015-09-23, 17:20 下午
Abstr 离线,最后访问时间: 2016/10/9 8:03:06 Abstr

发帖数前50位
注册: 2014-11-05
发 贴: 22
Re: 取地址指令指向的位置包含断点,导致访问违规(access validation)
Reply Quote
这种情况是我在实际代码中遇到的情况。一般是switch语句会出现这种代码生成
void foo()
{
switch(bar)
{
...
}
*}
在标*位置下断有几率触发上述问题。

硬件断点的数量有限,需求要求设置多个断点。
我找到一个方式规避:这种问题一般发生在函数末尾的“}”处,我设置断点的时候,把函数最后一行都屏蔽了。

IP 地址: 已记录   报告
   2015-10-20, 11:34 上午
Levwz 离线,最后访问时间: 2012/7/24 13:20:47 悬崖遛马

发帖数前25位
注册: 2012-07-24
发 贴: 30
Re: 取地址指令指向的位置包含断点,导致访问违规(access validation)
Reply Quote
个人觉得不太可能啊,除非ide有bug。
你不是在源代码里通过ide调试器gui,而是用bp设置的吧?
调试器会修改的肯定是指令地址,不应该是’内存‘地址啊

IP 地址: 已记录   报告
高端调试 » 软件调试 » C/C++本地代码调试 » Re: 取地址指令指向的位置包含断点,导致访问违规(access validation)

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.