2015-03-24 1 views
1

Je voudrais voir quand le programme entre dans une classe en utilisant Dtrace.Est-il possible de sonder l'entrée dans une classe C++ en utilisant Dtrace?

Par exemple:

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

il se déclenche lorsque le programme MyProgram entre dans la fonction fonction, maintenant comment puis-je écrire une sonde qui se déclenche lorsque le programme entre dans une classe plutôt qu'une fonction?

J'ai essayé: dtrace -c './myProgram' -n 'pid$target:myProgram:className:entry' mais le fait de cette façon fonctionne pas

+1

Il n'y a pas de "programme entrant dans une classe". Que voulez-vous dire? Presque tout le code exécutable est une fonction d'une forme ou d'une autre. Les classes peuvent avoir des fonctions membres, y compris des fonctions membres statiques, mais celles-ci sont toujours des fonctions. Les constructeurs et les destructeurs sont également des types spéciaux de fonctions. Essayez 'dtrace -l -n 'pid $ cible: myProgram :: entry' -c./MyProgram' pour voir une liste des points d'entrée de la fonction que DTrace connaît. (Puisque le nom de la fonction est vide, cela correspond à tout.) –

+0

Merci pour cette réponse, j'ai résolu mon problème avec ça. Je voulais savoir quand le programme entre dans une fonction membre. – Alessandro

+0

@Alessandro: S'il vous plaît poster votre solution comme une réponse à votre question. – myaut

Répondre

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

je peux avoir en sortie toutes les fonctions appelées à l'exécution, il se déclenche à la saisir d'une fonction et à sa revenir.

Le code que je sondage est la suivante:

#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; 
} 

et la sortie de DTrace je reçois est la suivante:

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 

maintenant je suis en train de l'analyser avec un script Python et faire un xml de l'arbre d'appel