2016-10-31 3 views
1

J'essaye d'employer stap pour juste imprimer toutes les fonctions qu'un programme appelle. Je l'ai fait quelques recherches en ligne et a trouvé ce script (appelé para-callgraph.stp):Comment éviter une erreur "Seuil de dépassement de la sonde dépassé" lors de l'utilisation de la touche système?

#! /usr/bin/env stap 

function trace(entry_p, extra) { 
    printf("%s%s%s %s\n", 
     thread_indent (entry_p), 
     (entry_p>0?"->":"<-"), 
     ppfunc(), 
     extra) 
} 

probe $1.call { trace(1, $$parms) } 
probe $1.return { trace(-1, $$return) } 

qui est destiné à être exécuté comme ceci:

sudo stap para-callgraph.stp 'process.function("*")' -c `pwd`/my-program 

Maintenant, quand je lance, je INTRODUISE un problème. Tout fonctionne très bien au début, mais bientôt systemtap imprime ce à stderr, et les sorties:

ERROR: probe overhead exceeded threshold 
WARNING: Number of errors: 1, skipped probes: 0 
WARNING: There were 62469 transport failures. 
WARNING: /usr/bin/staprun exited with status: 1 
Pass 5: run failed. [man error::pass5] 
Tip: /usr/share/doc/systemtap/README.Debian should help you get started. 

Faire des recherches online me révélé qu'une heuristique stap est déclenchée et me couper, et que je pouvais éteindre en ajoutant deux indicateurs -g et --suppress-time-limits. (Cette suggestion est soutenue par man stap sur mon système.) Cependant, cette solution ne fonctionne tout simplement pas et la commande:

sudo stap -g --suppress-time-limits para-callgraph.stp 'process.function("*")' -c `pwd`/core-cpu1 

affiche un message d'erreur très similaire, et les sorties:

ERROR: probe overhead exceeded threshold 
WARNING: Number of errors: 1, skipped probes: 0 
WARNING: There were 67287 transport failures. 
WARNING: /usr/bin/staprun exited with status: 1 
Pass 5: run failed. [man error::pass5] 
Tip: /usr/share/doc/systemtap/README.Debian should help you get started. 

Pourquoi ce drapeau n'est-il pas une solution appropriée à mon problème? Et ce problème peut-il être résolu d'une autre manière, ou est-ce que systemtap n'est tout simplement pas approprié pour ce type de cas d'utilisation?

Si cela est important, je l'utilise sur une machine virtuelle Ubuntu 32 bits.

N.B. Je suis plus intéressé par pourquoi SystemTap échoue ici, pas d'autres façons d'accomplir la même chose en utilisant d'autres logiciels. (En effet, il se trouve mon cas d'utilisation, le code ci-dessus était un abus de systemtap.)

+0

limites --suppress temps-doit avoir travaillé à la désactivation du mécanisme de prévention de surcharge. Pourriez-vous transmettre un rapport de bogue plus complet à la liste de diffusion (y compris la version de systemtap, et une idée de la nature de votre programme core-cpu1)? – fche

Répondre

0

tampon de transport entre les sondes et le consommateur est également limité, donc si vous imprimerez dans les sondes plus rapide que le consommateur peut prendre , vous verrez Il y avait des erreurs de transport NN erreur dans SystemTap ou DTrace tombe sur erreur CPU X sur DTrace.

La réponse à ce problème est simple: être moins bavard, les données provenant d'un tampon plus fréquemment (régulé par cleanrate accordable DTrace) ou augmenter la taille de la mémoire tampon (option -b et BufSize accordable dans DTrace et option -s dans SystemTap).

se réfèrent: http://myaut.github.io/dtrace-stap-book/dtrace-stap-book-ns.pdf