首页
社区
课程
招聘
如何调试 线程函数
发表于: 2011-3-25 00:04 6857

如何调试 线程函数

2011-3-25 00:04
6857
DWORD dwThreadID;
DWORD dwAddress;
HANDLE hThread;
TCHAR   szNotice[MAX_PATH];
unsigned __stdcall MyThread(void* pArguments)
{
        //我想让程序执行到这里的时候断下来
__asm
        {
                push        loopk
                pop        dwAddress
loopk:
        }
        wsprintf(szNotice,TEXT("地址:%X"),dwAddress);
        MessageBox(NULL,szNotice,TEXT("TITLE"),MB_OK);
        _endthreadex(0);
        return        0;
}

hThread = CreateThread(
            NULL,              // default security attributes
            0,                 // use default stack size  
            MyThread,          // thread function
            pData,             // argument to thread function
            0,                 // use default creation flags
            &dwThreadID);   // returns the thread identifier

试验了很多办法,包括把地址打印出来。我转到该处设置硬件执行断点都无效。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你用什么调试的啊?你试试用WINDBG,非常专业的一个调试工具,用着老爽了
2011-3-25 00:12
0
雪    币: 254
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
。。。。。。。。。。。。。。。。
2011-3-25 00:14
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
可以用windbg试试
2011-3-25 00:15
0
雪    币: 439
活跃值: (1279)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
5
调试的是一个游戏。而且情况挺特殊的,所以不能使用WINDBG、SYSER等内核调试器
2011-3-25 00:40
0
雪    币: 2687
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
WaitForSingleObject(hThread,INFINITE);
2011-3-25 01:46
0
雪    币: 2687
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
摘自《Windows并发编程指南》Page30
“当创建一个新的线程时,你必须指定一组信息,包括线程的起始执行函数等,此后将由Windows内核来接手所有的工作。当创建线程的请求成功返回时,新的线程已经被初始化,并且如果线程在创建后不是处于挂起状态,那么这个线程将被放入到线程队列中,并且随后被调度到处理器上执行。至于线程何时才能在处理器上运行,则要取决于线程调度器、系统负载及可用资源等因素。事实上,当创建线程的请求返回时,新的线程可能已经开始(甚至结束)了运行。”
希望我打了这么多字,你能明白为什么。
2011-3-25 01:56
0
雪    币: 220
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
呵呵 表示理解楼上的
2011-3-25 04:07
0
雪    币: 143
活跃值: (61)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
9
可以使用int3断点吧?^_^
添加一个最优先的SEH链
AddVectoredExceptionHandler

然后程序运行到int3,就会出发我们的SEH,
如果发现是我们下的int3,就中断,具体是Sleep,还是调用Debugger,还是挂起所有线程,你自己随便弄^_^

对应的,移除SEH:
RemoveVectoredExceptionHandler

代码使用例子(我的代码全部是学习用,没有注释,对不起啦)
如果下载不了,就用代理吧,被GFW了。
2011-3-27 15:02
0
雪    币: 143
活跃值: (61)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
10
重新看了下帖子,我看来是理解错了。

你的功能可以这样实现:
进OD,把即时调试器设置好。
在你要停的地方输入__asm _emit 0xcc
运行程序。
程序到那地方会出错,这时候点取消,OD会自动打开程序,程序也刚好断在那里(int3)^_^
2011-3-28 12:06
0
雪    币: 1149
活跃值: (833)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
11
WaitForSingleObject(hThread,INFINITE);
2011-3-28 12:24
0
雪    币: 2687
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
当主线程执行完毕后,进程也就退出了,这时进程中所有的资源,包括还没有执行的线程都要退出,也就是说新创建的线程还没有机会执行就退出了,因此你设的断点当然不会命中。
为了让新创建的线程能够得到执行的机会,就需要使主线程暂停执行,即放弃执行的权利,操作系统就会从等待运行的线程队列中选择一个线程来执行,这时新创建的线程才有执行的机会。
这时你可用Sleep()函数或者WaitForSingleObject()函数。
建议楼主可以结贴了。
2011-4-12 13:53
0
雪    币: 349
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
明显被F*ck了.....自己想办法吧..............
2011-4-12 14:18
0
游客
登录 | 注册 方可回帖
返回
//