首页
社区
课程
招聘
[求助]OD 硬件断点在多线程中不起作用?
发表于: 2011-2-14 10:09 9799

[求助]OD 硬件断点在多线程中不起作用?

2011-2-14 10:09
9799
帖子放在新手区两天没人理。。。只好发过来了

例:
程序有两个线程 R、W,有一个全局的变量 m,R线程不停的读变量 m,W线程不停的写该变量。

1、OD 在 R 读 m 变量的代码段上 F2 断下,此时,我发现了变量 m 的地址 &m,于是给该地址下 硬件断点-写 (hw &m),F9 让程序继续执行。发现 OD 无法断下 W 线程!

2、由于我知道了 m 的地址 &m ,于是我将 OD 中之前设置的硬件断点删除,在程序运行期间重新设置硬件断点-写 (hw &m)。发现 OD 在 W 线程断下!

3、上述两个情况下,使用普通内存断点,均可以在 W 线程断下。

4、另外情况1下,如果R线程有位置在写 m 的话,还是能够在 R 线程中断下的。

现在问题就是:如果我先用OD将程序断下,紧接着下硬件断点,然后恢复程序执行,OD的硬件断点对于其他线程似乎是无效的?!

我经常使用上述步骤来调试程序,最近才注意到这个问题。
请问大家是否有同样的问题? 如何解决?

随手写了个测试用例
#include "stdafx.h"
#include <iostream>
#include <Windows.h>

using namespace std;

int g_i = 0 ;

//线程W
LRESULT myWorkThread(DWORD)
{
  while (1)
  {
    g_i = g_i + 1 ;  //这里改写变量
    ::Sleep(3) ;
  }
}

//线程R
int _tmain(int argc, _TCHAR* argv[])
{
  CloseHandle(::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)myWorkThread,NULL,0,NULL)) ;
  while ( 1 )
  {
    cout << g_i << endl ; //手动在这里断下,然后下硬件写断点,OD无法在 myWorkThread 中断下
    Sleep(6*1000) ;
  }
  return 0;
}


[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 7
支持
分享
最新回复 (7)
雪    币: 331
活跃值: (57)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
硬件断点一定是跟线程相关的,操作系统在切换线程时会切换硬件断点寄存器Drx
2011-2-15 10:36
0
雪    币: 178
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
SetThreadContext isn't SetProcessContext
2011-2-15 13:14
0
雪    币: 134
活跃值: (55)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
终于有人回复了。。。

我当时也是想硬件断点应该会与线程相关,但当我在程序运行期,下 hw 硬件断点,OD 是可以断下的,此时似乎是在所有线程中都设置了这个断点。

我不解的是这两种操作,OD 难道是区别对待的?
2011-2-15 13:28
0
雪    币: 29
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
学习了。以后可得小心对待了
2011-2-17 02:08
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
6
某个线程HideFromDbg了~
2011-2-17 04:31
0
雪    币: 134
活跃值: (55)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
不会,这个是我自己的测试程序。

我就是对OD 的这两种操作(1、暂停程序->下硬断->恢复程序 2、直接下硬断)有些疑问。
2011-2-17 10:02
0
雪    币: 18
活跃值: (80)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
volatile int g_i = 0 ;
2011-4-26 21:14
0
游客
登录 | 注册 方可回帖
返回
//