首页
社区
课程
招聘
[旧帖] OD 硬件断点在多线程中不起作用? 0.00雪花
发表于: 2011-2-12 15:51 4383

[旧帖] OD 硬件断点在多线程中不起作用? 0.00雪花

2011-2-12 15:51
4383
例:
程序有两个线程 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;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 1689
活跃值: (379)
能力值: ( LV15,RANK:440 )
在线值:
发帖
回帖
粉丝
2
硬件断点是线程相关的。每个线程都有自己的上下文环境,当然包括那7调试寄存器的值。Windows内核是不断调度各个线程的。不同的线程上下文环境是不同的。由于OD设硬件断点是在当前的线程上下文环境里,所以其它的线程断不下来。希望能找到相关的插件解决问题,或者你可以采用内核极的调试器。
2011-4-1 22:13
0
游客
登录 | 注册 方可回帖
返回
//