首页
社区
课程
招聘
关于创建线程时调用的函数
发表于: 2015-8-5 15:14 3864

关于创建线程时调用的函数

2015-8-5 15:14
3864
我在用WINDBG调试一个多线程程序,希望在创建线程的地方断点,我在KERNELBASE!CreateThread上加断点断不到,应该加载什么上

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

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
啥程序呢呀
2015-8-5 15:23
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
正常情况下是能在CreateThread行上下断点的,如果不行的话,请在线程回调函数的第一行下断点
2015-8-5 15:40
0
雪    币: 80
活跃值: (13)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
一个基于bitshares的项目,代码封装太多,不知道在哪创建的线程,看起来比较累,所以想在通过调试找创建线程的地方
2015-8-5 15:54
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
WinDBG 提供了多种设断点的命令:bp, bu, bm, ba。

bp命令是在某个地址下断点,可以bp 0x7783FEB,也可以bp MyApp!SomeFunction。对于后者,WinDBG会自动找到MyApp!SomeFunction 对应的地址并设置断点。 但是使用bp的问题在于:1)当代码修改之后,函数地址改变,该断点仍然保持在相同位置,不一定继续有效; 2)WinDBG 不会把bp断点保存工作空间中。所以,我比较喜欢用bu命令。

bu命令是针对某个符号下断点。 比如bu MyApp!SomeFunction。在代码被修改之后,该断点可以随着函数地址改变而自动更新到最新位置。而且bu断点会保存在WinDbg工作空间中,下次启动Windbg的时候该断点会自动设置上去。

另外,在模块没有被加载的时候,bp断点会失败(因为函数地址不存在),而bu断点则可以成功。新版的WinDBG中bp失败后会自动被转成bu。

bm命令也是针对符号下断点。 但是它支持匹配表达式。很多时候你下好几个断点。比如,把MyClass所有的成员函数都下断点:bu MyApp!MyClass::* ,或者把所有以CreateWindow开头的函数都下断点:bu user32!CreateWindow* 。

以上三个命令是对代码下断点, 我们还可以对数据下断点。
ba命令就是针对数据下断点的命令,该断点在指定内存被访问时触发。命令格式为
ba Access Size [地址]

Access是访问的方式,比如e(执行),r(读/写),w(写)

Size是监控访问的位置的大小,以字节为单位。值为1、2或4,还可以是8(64位机)。
比如要对内存0x0483DFE进行写操作的时候下断点,可以用命令 ba w4 0x0483DFE

这里顺便提以下其他断点命令:

    bl 列出所有断点
    bc 清除断点
    bd 禁用断点
    be 启动被bd 命令经用的断点
2015-8-5 16:13
0
雪    币: 70
活跃值: (72)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
bp NtCreateThread ==> bp PspCreateThread
windbg用的不熟,这样的断点不一定断到目标线程上面,但肯定能断下来
不能用OD调么?
2015-8-5 17:10
0
雪    币: 80
活跃值: (13)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
我在winbdg的events fliters中设置在有线程新创建时中断,是可以触发的,停在RtlUserThreadStart中,但是我是想找到线程触发的位置,bp KERNELBASE!CreateThread,或者bp NtCreateThread ,都没有反应
2015-8-5 17:43
0
雪    币: 80
活跃值: (13)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
找到了断NtCreateThreadEx
2015-8-5 17:47
0
游客
登录 | 注册 方可回帖
返回
//