参考: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. MacBook Pro 快捷键2

    Mac 键盘快捷键 您可以按下组合键来实现通常需要鼠标.触控板或其他输入设备才能完成的操作.   要使用键盘快捷键,请按住一个或多个修饰键,同时按快捷键的最后一个键.例如,要使用快捷键 Command ...

  2. linux安装相关软件

    XShell上传jdk文件到Linux并安装配置1.yum -y install lrzsz2.sudo rz选文件3.sudo tar -zxvf jdk-8u131-linux-x64.tar.g ...

  3. OAccflow集成sql

    SELECT * FROM PORT_EMP WHERE NO='18336309966'SELECT * FROM PORT_DEPT WHERE no='42DBAF50712C4046B09BC ...

  4. 74HC AHCT LS LV ABT区别

    1. 含义 2. 74AHC 74AHCT 74LV 74LS 2.1 解释 AHC与AHCT均是先进的高速的CMOS器件,但是供电电压范围不同,输入的逻辑电平也不同. LV是低压版,当自身供电电压为 ...

  5. 2019ccpc网络赛hdu6703 array(线段树)

    array 题目传送门 解题思路 操作1是把第pos个位置上的数加上\(10^7\),操作2是找到区间[1,r]中没有且大于k的最小的数.注意到k的范围是小于等于n的,且n的范围是\(10^5\),远 ...

  6. java 并发——CountDownLatch

    java 并发--CountDownLatch 简介 public class CountDownLatch { private final Sync sync; private static fin ...

  7. jdk紧急漏洞,XMLDecoder反序列化攻击

    昨天在公司发现了一个jdk中的XMLDecoder反序列化的漏洞,看起来很危险!下面通过两个示例来看看这个漏洞的危害! 示例1:利用XmlDecoder删除本地文件 首先来看这个xmldecoder. ...

  8. 关于pandas

    axis轴,axis=0为逐行,axis=1为逐列

  9. servlet配置url-pattern的匹配规则

    <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.qf.servlet.H ...

  10. 当vue页面异步加载的数据想在页面上渲染怎么办

    <template> <div class="test"> <div v-for="(item, index) in arr" : ...