今天碰到了一个多线程的程序。一时间没了主意,后面查找了资料总结一下两种可行的方法, 先poll出一个做例子吧:
首先最简单的一种,OD自带的:
勾选这两个选项即可。
勾选完后调用完这个CreateThread直接按F9运行程序
就发现被断在了kernel32.dll模块里,这也很正常,因为CreateThread就是从这个库里导出的,但是我的目的是调试用户代码。
然后接着按F9就可以断在用户代码里了, 当然前提是你得在用户代码起始位置下个断点。
怎么在线程用户代码处下断? CreateThread不是压入了线程函数首地址吗,利用栈内的数据即可。 来看看:
这种方法有缺点也有优点。优点就是无脑直接怼就行。缺点就是不够灵活,如果我现在想回到主线程调试该怎么办? 还有它会在任何一个新线程创建结束都被断下,有时候很烦人。
下面说说第二种方法:
首先在线程函数下断点:
接着运行完CreateThread别动
进入OD的线程窗口,快捷键Alt+T打开,双击你要调试的线程进入
发现现在在系统领空内,直接按F8
这样就直接进入了要调试的线程了
如果说我现在想继续调试主线程或者其他线程该怎么办?直接双击进入
这样你就会发现切换回主线程了
(完)