2016-02-27 2 views
2

J'écris un outil valgrind qui, dans le cadre de son instrumentation, remplace certains appels de fonction en utilisant le mécanisme de remplacement de fonction valgrind supplies. La fonction de remplacement met immédiatement fin aux arguments et appelle dans le code de l'outil en utilisant le mécanisme de demande du client. La chose est, une fois que je suis dans l'outil, je veux savoir l'emplacement où la fonction de remplacement a été appelée, de sorte que je peux l'utiliser pour signaler les résultats à l'utilisateur. Mais je ne trouve pas de moyen fiable et multiplateforme de le faire. Jusqu'à présent, j'ai travaillé sur Linux en instrumentant chaque AbiHint pour stocker son adresse dans la mémoire de l'outil s'il semble être dans un emplacement de code utilisateur, puis en récupérant cette adresse une fois que nous sommes dans le code d'outil appelé par le remplaçant fonction. Mais d'après ce que j'ai lu, je ne serai pas en mesure de me fier à ces plateformes multiplateformes AbiHints, et de toute façon, cela semble une solution hacky et fragile. Y at-il un bon moyen de le faire?Existe-t-il un moyen fiable d'obtenir l'emplacement d'appel d'une fonction enveloppée dans un outil Valgrind?

Répondre

2

Un outil signale à l'utilisateur des erreurs utilisent les fonctions disponibles dans pub_tool_errormgr.h Ces rapportera la trace de la pile d'hôtes, qui devrait donner l'endroit où la fonction remplacée a été appelée. Vous pouvez également, si nécessaire, obtenir directement une trace de pile d'invité à l'aide des fonctions pub_tool_execontext.h.

+0

Merci, implémenté! –