参考: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. webpack中的url-loader

    使用url-loader引入图片,可以说它是file-loader的增强版 url-loader会把我们的图片使用base64的形式编码成另外一种字符串,网页是可以识别这种编码的东西的,这样的好处是, ...

  2. MySQL导入导出数据和表结构 source和mysqldump

    MySQL导入数据的方式: 1.使用source /dir/test.sql导入数据进入数据库:查询数据库编码格式show variables like "%char%";设置编码 ...

  3. maven项目报错:Class path contains multiple SLF4J bindings

    maven项目编译不报错,运行时报错如下: SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [b ...

  4. RHEL6.1 安装 Oracle10gr2 (图文、解析)

    目录 目录 软件环境 前言 初始化RHEL61 硬件检测 预安装软件包 安装oratoolkit 创建Oracle用户 修改配置文件 系统版本伪装 解压并运行Oracle10gr2安装包 安装rlwr ...

  5. Python Numpy 矩阵级基本操作(2)

    1.开方与求e指数 import numpy as np from numpy.matlib import randn print "Test sqrt and exp" arr ...

  6. JOGL教程

    本章介绍了OpenGL,Java OpenGL绑定(GL4java,LWJGL,JOGL)和JOGL比其他的OpenGL的优点. Java支持OpenGL(JOGL)是近期在Java OpenGL图形 ...

  7. vim以超级用户权限保存文件

    以普通用户打开文件 保存时执行 :w !sudo tee % > /dev/null

  8. Error (10170): Verilog HDL syntax error at passwd.v(21) near text "if"; expecting an identifier ("if" is a reserved keyword ), or "endmodule", or a parallel statement

    你得加上时序啊笨蛋

  9. android中使用MediaPlayer和SurfaceView播放视频

    package com.test.video; import java.io.IOException; import android.media.AudioManager; import androi ...

  10. 消费kafka的消息,并将其SparkStreaming结果保存到mysql

    将数据保存到mysql,需要用到jdbc.为了提高保存速度,我写了一个连接池 1.保存到mysql的代码 package test05 import org.apache.log4j.{Level, ...