-
-
[旧帖]
OD 硬件断点在多线程中不起作用?
0.00雪花
-
发表于:
2011-2-12 15:51
4383
-
[旧帖] OD 硬件断点在多线程中不起作用?
0.00雪花
例:
程序有两个线程 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;
}
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!