首页
社区
课程
招聘
[原创]D Probe 1.0
发表于: 2012-5-28 23:10 11365

[原创]D Probe 1.0

irp 活跃值
1
2012-5-28 23:10
11365

解压后运行 dprobe.exe, 菜单选择 probe -> import probe, 选择explorer.dpc, 就可以进行快速体验。所有的capture filter代码都在sdk\flt 目录下。你可以自己写filter, 参考psflt即可。类似的工具是rohitab.com的apimonitor 等, 你可以比较下。以后有空放一个chm手册上来。技术上也没有什么特别的,只是花了不少心血。希望你能喜欢

简单介绍:
这是个 user mode call trace 工具,下面是一些功能截图。

(1) 主界面


(2) import probe
import filter 可以方便的引入一组probe, 不用每次运行都手工配置。


(3) export probe
export probe 把配置的probe输出到dpc文件,dpc文件可以被import, 参见(2)。


(4) call tree
请读 README.txt中的call tree解释,这个call tree是按照完成顺序来显示的。


(5) display filter
trace的记录可以按照条件来筛选。比如只显示某个线程的记录。


(6) stack trace
每条记录都有对应的stack trace.


(7) summary
summary 显示了简单的计数统计信息。


(8) report
trace的记录可以被保存为dtl, csv两种格式,dtl report可以被dprobe打开分析。
report size 没有限制可以很大,如果trace 某些调用频繁的函数,记录很快会
达到数百万条,注意这点。report可以只保存display filter过滤得部分。


(9) perfmon
performance 显示了target process的主要性能计数器,dprobe还有两个stack trace
相关的,stack trace buckets 和symbol buckets, 表示收集的stack trace 样本的数量,
一般不会超过10万个,一般程序的code path在运行段时间后会趋于稳定。


程序会crash, 所以附上pdb, 在sym目录下,你可以在windbg里!analyze -v 以下生成的
crash dump,bug report to dprobebugs@gmail.com。别忘了先读README。

另附上一个手册,比较早,现在版本已经不同,不过里面的逻辑都是一样的,可以参考。

2012-5-31:
更新dprobe.exe, fix 用户浏览call detail/call record的UI会hang的问题,大幅降低cpu/mm
使用率。 解压后覆盖dprobe.exe即可。


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

上传的附件:
收藏
免费 6
支持
分享
最新回复 (12)
雪    币: 2284
活跃值: (2170)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
2
工具写的不错。
2012-5-29 11:26
0
雪    币: 347
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
真不错,感谢分享~
2012-5-29 16:16
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
强力支持
2012-5-30 09:59
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
5
开源吧,。。。。。。。。。
2012-5-30 10:11
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
6
开源了之后,作者就懒得更新了。还是这样吧。
想要跟踪正在运行的程序,可以吗?
2012-5-30 13:04
0
雪    币: 185
活跃值: (86)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
dprobe 支持两种模式,
run mode, 菜单file->run -> ,输入exe path, 输入dpc path, dprobe会启动进程,dpc是一个api filter, 描述你要trace的api.
这个需要事先输出一个dpc文件。可以  菜单 probe -> fast probe, or fillter probe, 然后选择输出。这个主要是为了trace一些很早被调用的api, 一般不用它。

attach mode,
可以选择正在运行的进程来trace, 菜单 probe -> fast probe, or fillter probe即可。

filter 都提供了源代码,dprobe.btr.dll这个runtime因为被用在我的另一个产品中,所以抱歉,暂时不能开源。
2012-5-30 13:16
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
8
能不能像 procmon 那样,先设定好过滤器,再直接运行目标进程?
2012-5-30 14:13
0
雪    币: 185
活跃值: (86)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
run mode就类似procmon, 不过procmon启动允许你修改引入的过滤器,dprobe目前不支持。
dpc文件实质就是一个DllName!ApiName的数组,描述了要trace的函数。dprobe设计的时候
主要参考的就是procmon,只不过它是kernel driver + ETW,dprobe主要是usermode
的hook, 考虑到大多数需求实质和kernel无关。

参见7楼,我的描述会引起误解,修正了。
2012-5-30 14:31
0
雪    币: 255
活跃值: (49)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
10
这个工具写得很好! 感谢lz分享

使用时的小问题:
1、在监控列表中 选择 Call Stack 和 Call Detail 时,程序进入假死状态。
2、在上述情况发生后,再次进行相同操作,发现有一些API无法进行监控,提示错误,访问拒绝。

希望lz的作品越做越好! ^_^
2012-5-30 19:00
0
雪    币: 185
活跃值: (86)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
thanks :),

1, 这个主要是stack trace时候symbol loading的问题,dbghelp.dll设计的时候限制
      为单线程,所以,只能用lock来保护, decode thread和UI thread会竞争这个锁,
      导致最初的时候UI会hang, 不过运行一段时间,code coverage基本稳定的时候
      这个一般不会发生。请看readme.txt. 下个release会redesign stack trace。
2,  某些api出现 BTR_E_ACCESSDENIED, 或者BTR_E_CANNOT_PROBE是runtime
    自身的限制,比如 x64  很多api  采用 sub rsp, 0x28, call qword ptr[xxx]的形式
   runtime目前不能处理这种case.  x86版本这个问题很少见。
2012-5-30 19:10
0
雪    币: 292
活跃值: (153)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
威胁:修改此注册表项将更改IE连接设置。少数软件会修改此项,如果随意修改,可能造成无法上网。如果您不认识此程序,请阻止。

来源:C:\Users\lenovo\Desktop\dprobe-v1-2012-05-29\x64\dprobe.exe

目标:HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\INTERNET SETTINGS\CONNECTIONS\[DefaultConnectionSettings]\[46 00 00 00 DF 01 00 00 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 44 F5 DC AD 56 3E CD 01 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 02 00 00 00 C0 A8 28 01 00 00 00 00 00 00 0

What   the   f****  that?
2012-5-30 19:19
0
雪    币: 185
活跃值: (86)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
dprobe不会访问注册表, dbghelp在download symbol的时候"可能会", 不确定。可能是误报。
2012-5-30 19:29
0
游客
登录 | 注册 方可回帖
返回
//