Sleepy与DbgHlp库学习
参考:http://msdn.microsoft.com/en-us/library/windows/desktop/ms679291(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms680181(v=vs.85).aspx
http://sleepy.sourceforge.net/
http://www.codersnotes.com/sleepy
Very Sleepy是一个比较好用的Profiler工具(是对Sleepy的改进版本),开源,代码也很简洁。
那么Sleepy的原理是什么呢?
Sleepy程序作为主进程,启动子进程,或者Attach到目标进程上,从而获取到目标进程的第一个线程。
Sleepy每隔很短的一段时间就调用一次sample取样操作
void CALLBACK sprof_callback(UINT wTimerID, UINT msg,
DWORD dwUser, DWORD dw1, DWORD dw2)
{
ProfilerThread* thread = (ProfilerThread*)dwUser;
thread->sample();
}
然后将目标线程暂停,并且查看目标线程正在执行的eip地址
void Profiler::sampleTarget()
{
// An open question is whther or not this routine can be called
// reentrantly by the multi-media timer support.
HRESULT result = SuspendThread(target_thread);
if(result == 0xffffffff)
throw ProfilerExcep("SuspendThread failed.");
CONTEXT threadcontext;
threadcontext.ContextFlags = CONTEXT_i386 | CONTEXT_CONTROL;
result = GetThreadContext(target_thread, &threadcontext);
if(!result)
throw ProfilerExcep("GetThreadContext failed.");
PROFILER_ADDR addr = threadcontext.Eip;
//std::cout << "addr: " << addr << std::endl;
result = ResumeThread(target_thread);
if(!result)
throw ProfilerExcep("ResumeThread failed.");
//NOTE: this has to go after ResumeThread. Otherwise mem allocation needed by std::map
//may hit a lock held by the suspended thread.
counts[addr]++;
}
并且将维护一张map,记录各个被取样到的ip地址被调用到的次数。
最后再通过DbgHlp的Sym功能,将ip地址映射成具体的函数名称。
Very Sleepy加入了Call Graph的feature,可以统计Include/Exclude方式下的某个函数被调用的计数。
估计是使用了DbgHelp的StackWalk64函数。
基于对pin的学习,这个功能很容易地用pintool重新改写。
但是,pintool的好处在哪呢?
Sleepy与DbgHlp库学习的更多相关文章
- python 操作exls学习之路1-openpyxl库学习
这篇要讲到的就是如何利用Python与openpyxl结合来处理xlsx表格数据.Python处理表格的库有很多,这里的openpyxl就是其中之一,但是它是处理excel2007/2010的格式,也 ...
- dlib库学习之一
dlib库学习之一 1.介绍 跨平台 C++ 通用库 Dlib 发布 ,带来了一些新特性,包括概率 CKY 解析器,使用批量同步并行计算模型来创建应用的工具,新增两个聚合算法:中国低语 (Chines ...
- python_库学习_01
一.python的库学习之 财经数据接口包 1.安装ThShare 直接pip install tushare 可能会出现缺少依赖库的情况,依次安装,大概有lxml,pandas,bs4,reques ...
- numpy, matplotlib库学习笔记
Numpy库学习笔记: 1.array() 创建数组或者转化数组 例如,把列表转化为数组 >>>Np.array([1,2,3,4,5]) Array([1,2,3,4,5]) ...
- python爬虫解析库学习
一.xpath库使用: 1.基本规则: 2.将文件转为HTML对象: html = etree.parse('./test.html', etree.HTMLParser()) result = et ...
- 【mmall】Guava库学习Collections
参考链接 Guava库学习:学习Collections(三)Sets
- muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor
目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...
- muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制
目录 muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制 eventfd的使用 eventfd系统函数 使用示例 EventLoop对eventfd的封装 工作时序 runInLoo ...
- muduo网络库学习笔记(三)TimerQueue定时器队列
目录 muduo网络库学习笔记(三)TimerQueue定时器队列 Linux中的时间函数 timerfd简单使用介绍 timerfd示例 muduo中对timerfd的封装 TimerQueue的结 ...
随机推荐
- legend2---17、legend2里面怎么面向对象
legend2---17.legend2里面怎么面向对象 一.总结 一句话总结: mvc本身挺优:本身mvc的开发模式,就算是面向过程下也还行,如果面向对象那就更加棒了 实体类无需属性:由于php的生 ...
- 63、saleforce DML
PRIVELEGE__c privilege = new PRIVELEGE__c(PRIVILAGENAME__c = '权限添加',PRIVILAGEDESCRIBE__c = '权限描述'); ...
- java.net.BindException: Address already in use: 解决方法
java.net.BindException: Address already in use: 解决方法 1. 执行cmd 2. cmd命令模式下输入netstat -ano,然后找到占用端口的那 ...
- vue 项目配置 element 出错
解决方法: 把main.js文件中的 import 'element-ui/lib/theme-default/index.css' 改为 import 'element-ui/lib/theme-c ...
- leetcode python两整数之和
# Leetcode 371 两整数之和***### 题目描述 **不使用**运算符 `+` 和 `-` ,计算两整数 `a `.`b` 之和. **示例1: ...
- Python 字符串常用判断函数
判断字符串常用函数: S代表某字符串 S.isalnum() 所有字符都是数字或字母,为真返回Ture,否则返回False S.isalha() 所有字符都是字母,为真返回Ture,否则返回 ...
- win10居然把Linux的引导覆盖了
昨天晚上装了个windows10系统试了试,发现触摸板真的难用.最基本的双指点击做右键都搞不出来,开始菜单里要上下滚动的时候触摸板竟然要水平滑动-- 重启的时候发现居然没有Linux的引导选项了 试了 ...
- Codeforces 1167E 尺取法
题意:给你一个长度为n的数组,以及数组中的数的取值范围1 - m,问有多少个区间[l, r],使得删除了数组中数值为[l, r]的数之后,数组是非递减的. 思路:我们记录一下每一个数出现的最左端和最右 ...
- ES6 数组扩展(总结)
1.扩展运算符 将一个数组转为用逗号分隔的参数序列 console.log(1, ...[2, 3, 4], 5) // 1 2 3 4 5 2.Array.from() 将两类对象转为真正的数组 类 ...
- windows10 注销 锁定
锁定,暂时离开电脑时使用. 跑程序,下载内容(注意有时要修改一些软件的设置)继续进行. 锁定电脑,这时就不要关机. 注销快于重启. 一个账号 后台跑程序 https://zhidao.baidu.co ...