【问题标题】:Is it possible to probe the entry in a C++ class using Dtrace?是否可以使用 Dtrace 探测 C++ 类中的条目?
【发布时间】:2015-05-27 05:53:27
【问题描述】:

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

例如:

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

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

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

【问题讨论】:

  • 没有“程序进入[ing]类”之类的东西。你的意思是?几乎所有可执行代码都是一种或另一种形式的函数。类可以有成员函数,包括静态成员函数,但那些仍然是函数。构造函数和析构函数也是特殊类型的函数。尝试dtrace -l -n 'pid$target:myProgram::entry' -c ./myProgram 查看 DTrace 知道的函数入口点列表。 (因为函数名是空的,所以它匹配一切。)
  • 感谢您的回答,我解决了我的问题。我想知道程序什么时候进入成员函数。
  • @Alessandro:请发布您的解决方案作为您问题的答案。

标签: c++ class dtrace dynamic-analysis


【解决方案1】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多