c++ - 是否可以使用 Dtrace 探测 C++ 类中的条目?

标签 c++ class dtrace dynamic-analysis

我想看看程序何时进入使用 Dtrace 的类。

例如:

dtrace -c './myProgram' -n 'pid$target:myProgram:function:entry'

当程序 myProgram 进入函数 function 时触发, 现在我该如何编写一个在程序进入类而不是函数时触发的探测器?

我试过: dtrace -c './myProgram' -n 'pid$target:myProgram:className:entry' 但它不起作用

最佳答案

dtrace -c './main' -n 'pid$target:main::entry' -n 'pid$target:main::return'

通过这种方式,我可以输出运行时调用的所有函数,它会在函数进入和返回时触发。

我正在探测的代码是这样的:

#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

class Polygon {
  protected:
    int width, height;
  public:
    void set_values (int a, int b)
      { width=a; height=b; }
    virtual int area ()
      { return 0; }
};

class Rectangle: public Polygon {
  public:
    int area()
      { 
        foo();
        return width*height; 
     }
    void foo(){}
};

class Triangle: public Polygon {
  public:
    int area()
    { 
        foo();
        return width*height/2; 
      }
    void foo(){}
};

int main () {

    //initialize random seed
    srand(time(NULL));

    if(rand() % 2)
        {
            Rectangle rect;
            Polygon * ppoly = &rect;
            ppoly->set_values (4,5);
            ppoly->area();
        }
    else
        {
            Triangle trgl;
            Polygon * ppoly = &trgl;
            ppoly->set_values (4,5);
            ppoly->area();
        }
    return 0;
}

我得到的 dtrace 输出是这样的:

CPU     ID                    FUNCTION:NAME
  3 109401                       main:entry 
  3 109404       Triangle::Triangle():entry 
  3 109405         Polygon::Polygon():entry 
  3 109415        Polygon::Polygon():return 
  3 109414      Triangle::Triangle():return 
  3 109403 Polygon::set_values(int, int):entry 
  3 109413 Polygon::set_values(int, int):return 
  3 109406           Triangle::area():entry 
  3 109407            Triangle::foo():entry 
  3 109417           Triangle::foo():return 
  3 109416          Triangle::area():return 
  3 109411                      main:return 

现在我正尝试用 Python 脚本解析它并制作调用树的 xml

关于c++ - 是否可以使用 Dtrace 探测 C++ 类中的条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29223843/

相关文章:

c++ - A* 跳跃点搜索——剪枝是如何真正起作用的?

C++ 通过指针实例化

ios - 是否有任何工具可以跟踪 iOS 上特定文件的页面错误和其他相关事件?

c++ - vc++ (sqlite) 如何区分语句是 SELECT - 还是 NOT?

c++ - 解析缓冲区 C - 前进缓冲区过去的空白,存储字

c++ - 按值传递类和结构

macos - 是否可以在 Mac OS X 上通知 DTrace 动态生成的代码?

unix - 使用 -c 标志时如何重定向 Dtrace 输出?

c++ - 具有可变类型容器的类模板

block 内声明的对象的 C++ 持久性,内存泄漏的可能性?