参考: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库学习的更多相关文章

  1. python 操作exls学习之路1-openpyxl库学习

    这篇要讲到的就是如何利用Python与openpyxl结合来处理xlsx表格数据.Python处理表格的库有很多,这里的openpyxl就是其中之一,但是它是处理excel2007/2010的格式,也 ...

  2. dlib库学习之一

    dlib库学习之一 1.介绍 跨平台 C++ 通用库 Dlib 发布 ,带来了一些新特性,包括概率 CKY 解析器,使用批量同步并行计算模型来创建应用的工具,新增两个聚合算法:中国低语 (Chines ...

  3. python_库学习_01

    一.python的库学习之 财经数据接口包 1.安装ThShare 直接pip install tushare 可能会出现缺少依赖库的情况,依次安装,大概有lxml,pandas,bs4,reques ...

  4. numpy, matplotlib库学习笔记

    Numpy库学习笔记: 1.array()   创建数组或者转化数组 例如,把列表转化为数组 >>>Np.array([1,2,3,4,5]) Array([1,2,3,4,5]) ...

  5. python爬虫解析库学习

    一.xpath库使用: 1.基本规则: 2.将文件转为HTML对象: html = etree.parse('./test.html', etree.HTMLParser()) result = et ...

  6. 【mmall】Guava库学习Collections

    参考链接 Guava库学习:学习Collections(三)Sets

  7. muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor

    目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...

  8. muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制

    目录 muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制 eventfd的使用 eventfd系统函数 使用示例 EventLoop对eventfd的封装 工作时序 runInLoo ...

  9. muduo网络库学习笔记(三)TimerQueue定时器队列

    目录 muduo网络库学习笔记(三)TimerQueue定时器队列 Linux中的时间函数 timerfd简单使用介绍 timerfd示例 muduo中对timerfd的封装 TimerQueue的结 ...

随机推荐

  1. legend2---17、legend2里面怎么面向对象

    legend2---17.legend2里面怎么面向对象 一.总结 一句话总结: mvc本身挺优:本身mvc的开发模式,就算是面向过程下也还行,如果面向对象那就更加棒了 实体类无需属性:由于php的生 ...

  2. 63、saleforce DML

    PRIVELEGE__c privilege = new PRIVELEGE__c(PRIVILAGENAME__c = '权限添加',PRIVILAGEDESCRIBE__c = '权限描述'); ...

  3. java.net.BindException: Address already in use: 解决方法

    java.net.BindException: Address already in use: 解决方法   1. 执行cmd 2. cmd命令模式下输入netstat -ano,然后找到占用端口的那 ...

  4. vue 项目配置 element 出错

    解决方法: 把main.js文件中的 import 'element-ui/lib/theme-default/index.css' 改为 import 'element-ui/lib/theme-c ...

  5. leetcode python两整数之和

    # Leetcode 371 两整数之和***### 题目描述 **不使用**运算符 `+` 和 `-` ​​​​​​​,计算两整数 `​​​​​​​a `.`b` ​​​​​​​之和. **示例1: ...

  6. Python 字符串常用判断函数

    判断字符串常用函数: S代表某字符串 S.isalnum()  所有字符都是数字或字母,为真返回Ture,否则返回False S.isalha()     所有字符都是字母,为真返回Ture,否则返回 ...

  7. win10居然把Linux的引导覆盖了

    昨天晚上装了个windows10系统试了试,发现触摸板真的难用.最基本的双指点击做右键都搞不出来,开始菜单里要上下滚动的时候触摸板竟然要水平滑动-- 重启的时候发现居然没有Linux的引导选项了 试了 ...

  8. Codeforces 1167E 尺取法

    题意:给你一个长度为n的数组,以及数组中的数的取值范围1 - m,问有多少个区间[l, r],使得删除了数组中数值为[l, r]的数之后,数组是非递减的. 思路:我们记录一下每一个数出现的最左端和最右 ...

  9. ES6 数组扩展(总结)

    1.扩展运算符 将一个数组转为用逗号分隔的参数序列 console.log(1, ...[2, 3, 4], 5) // 1 2 3 4 5 2.Array.from() 将两类对象转为真正的数组 类 ...

  10. windows10 注销 锁定

    锁定,暂时离开电脑时使用. 跑程序,下载内容(注意有时要修改一些软件的设置)继续进行. 锁定电脑,这时就不要关机. 注销快于重启. 一个账号 后台跑程序 https://zhidao.baidu.co ...