L'histoire d'un hacker
La date est le 12/02/10. Les jours avant Noël s'égouttent et j'ai quasiment frappé un barrage routier majeur en tant que programmeur Windows. J'utilise AQTime, j'ai essayé somnolent, brillant et très endormi, et au moment où nous parlons, VTune est en train d'installer. J'ai essayé d'utiliser le profileur VS2008, et cela a été positivement punissant et souvent insensible. J'ai utilisé la technique de pause aléatoire. J'ai examiné les arbres d'appels. J'ai déclenché des traces de fonction. Mais le triste fait douloureux de la question est que l'application avec laquelle je travaille compte plus d'un million de lignes de code, avec probablement un autre million de lignes d'applications tierces.
J'ai besoin de meilleurs outils. J'ai lu les autres sujets. J'ai essayé chaque profileur répertorié dans chaque sujet. Il doit simplement y avoir quelque chose de mieux que ces options junky et coûteuses, ou des quantités de travail ridicules pour presque aucun gain. Pour compliquer davantage les choses, notre code est fortement threadé et exécute un certain nombre de boucles Qt Event, dont certaines sont si fragiles qu'elles plantent sous une instrumentation lourde en raison de retards de synchronisation. Ne me demandez pas pourquoi nous exécutons plusieurs boucles d'événements. Personne ne peut me le dire.
Existe-t-il d'autres options du type Valgrind dans un environnement Windows?
Y a-t-il quelque chose de mieux que la longue bande d'outils cassés que j'ai déjà essayés?
Y a-t-il quelque chose conçu pour s'intégrer à Qt, peut-être avec un affichage utile des événements dans la file d'attente?
Une liste complète des outils que j'ai essayés, avec ceux qui étaient vraiment utiles en italique:
- AQTime: Plutôt bien! A quelques problèmes avec la récursivité profonde, mais le graphe d'appel est correct dans ces cas, et peut être utilisé pour dissiper toute confusion que vous pourriez avoir. Ce n'est pas un outil parfait, mais qui vaut la peine d'être essayé. Cela pourrait répondre à vos besoins, et c'était certainement assez bien pour moi la plupart du temps.
- Attaque de pause aléatoire en mode débogage: pas assez d'informations assez souvent.
Un bon outil mais pas une solution complète. - Studios parallèles: l'option nucléaire. Obtrusif, étrange et incroyablement puissant. Je pense que vous devriez passer l'évaluation de 30 jours et déterminer si cela vous convient. C'est vraiment cool aussi.
- AMD Codeanalyst: merveilleux, facile à utiliser, très sujet aux plantages, mais je pense que c'est une question d'environnement. Je recommanderais de l'essayer, car il est gratuit.
- Luke Stackwalker: Fonctionne bien sur les petits projets, c'est un peu essayer de le faire fonctionner sur le nôtre. Quelques bons résultats cependant, et cela remplace définitivement Sleepy pour mes tâches personnelles.
- PurifyPlus: pas de support pour les environnements Win-x64, principalement Windows 7. Sinon excellent. Un certain nombre de mes collègues d'autres ministères ne jurent que par cela.
- VS2008 Profiler: produit une sortie de plus de 100 concerts en mode trace de fonction à la résolution requise. Du côté positif, produit des résultats solides.
- GProf: nécessite que GCC soit même modérément efficace.
- VTune: le support W7 de VTune est à la limite du criminel. Sinon excellent
- PIN: J'aurais besoin de pirater mon propre outil, c'est donc en quelque sorte un dernier recours.
- Sleepy \ VerySleepy: Utile pour les petites applications, mais me manque ici.
- EasyProfiler: Pas mal si cela ne vous dérange pas un peu de code injecté manuellement pour indiquer où instrumenter.
- Valgrind: * nix seulement, mais très bien lorsque vous êtes dans cet environnement.
- OProfile: Linux uniquement.
- Proffy: Ils tirent sur des chevaux sauvages.
Outils suggérés que je n'ai pas essayés:
- XPerf:
- Glowcode:
- Devpartner:
Remarques: environnement Intel pour le moment. VS2008, améliorez les bibliothèques. Qt 4+. Et le misérable de tous: l'intégration Qt / MFC via trolltech.
Maintenant: presque deux semaines plus tard, il semble que mon problème soit résolu. Grâce à une variété d'outils, y compris presque tout sur la liste et quelques astuces personnelles, nous avons trouvé les principaux goulots d'étranglement. Cependant, je vais continuer à tester, explorer et essayer de nouveaux profileurs ainsi que de nouvelles technologies. Pourquoi? Parce que je vous le dois, parce que vous êtes rock. Cela ralentit un peu la chronologie, mais je suis toujours très excité de continuer à essayer de nouveaux outils.
Synopsis
Parmi de nombreux autres problèmes, un certain nombre de composants avaient récemment été basculés vers le modèle de threading incorrect, provoquant de sérieux blocages dus au fait que le code sous nous n'était soudainement plus multithread. Je ne peux pas en dire plus car cela enfreint mon NDA, mais je peux vous dire que cela n'aurait jamais été trouvé par une inspection occasionnelle ou même par un examen normal du code. Sans les profileurs, les callgraphes et les pauses aléatoires en même temps, nous hurlerions toujours notre fureur face au magnifique arc bleu du ciel. Heureusement, je travaille avec certains des meilleurs hackers que j'ai jamais rencontrés, et j'ai accès à un incroyable verset plein d'outils et de gens formidables.
Gentlefolk, j'apprécie énormément cela, et je regrette seulement de ne pas avoir assez de représentants pour récompenser chacun de vous avec une prime. Je pense toujours que c'est une question importante à laquelle obtenir une meilleure réponse que celles que nous avons jusqu'à présent sur les SO.
En conséquence, chaque semaine pendant les trois prochaines semaines, je vais mettre en place la plus grande prime que je puisse me permettre et l'attribuer à la réponse avec le meilleur outil qui, à mon avis, n'est pas de notoriété publique. Après trois semaines, nous espérons avoir accumulé un profil définitif des profileurs, si vous pardonnez mon jeu de mots.
À emporter
Utilisez un profileur. Ils sont assez bons pour Ritchie, Kernighan, Bentley et Knuth. Je me fiche de qui vous pensez être. Utilisez un profileur. Si celui que vous avez ne fonctionne pas, trouvez-en un autre. Si vous n'en trouvez pas, codez-en un. Si vous ne pouvez pas en coder un, ou s'il s'agit d'un petit blocage, ou si vous êtes simplement bloqué, utilisez une pause aléatoire. Si tout le reste échoue, embauchez des étudiants diplômés pour frapper un profileur.
Une vue plus longue
Donc, j'ai pensé que ce serait bien d'écrire un peu de rétrospective. J'ai choisi de travailler de manière intensive avec Parallel Studios, en partie parce qu'il est en fait construit au-dessus de l'outil PIN. Ayant eu des relations universitaires avec certains des chercheurs impliqués, j'ai estimé que c'était probablement une marque d'une certaine qualité. Heureusement, j'avais raison. Bien que l'interface graphique soit un peu affreuse, j'ai trouvé IPS incroyablement utile, même si je ne peux pas le recommander à tout le monde. De manière critique, il n'y a pas de moyen évident d'obtenir le nombre de succès au niveau de la ligne, ce que fournissent AQT et un certain nombre d'autres profileurs, et j'ai trouvé très utile pour examiner le taux de sélection de branche, entre autres. Sur le net, j'ai également aimé utiliser AQTime et j'ai trouvé que leur support était vraiment réactif. Encore une fois, je dois nuancer ma recommandation: Beaucoup de leurs fonctionnalités ne fonctionnent pas très bien, et certaines d'entre elles sont carrément sujettes à des plantages sous Win7x64. XPerf a également fonctionné admirablement, mais est extrêmement lent pour les détails d'échantillonnage nécessaires pour obtenir de bonnes lectures sur certains types d'applications.
À l'heure actuelle, je dois dire que je ne pense pas qu'il existe une option définitive pour profiler le code C ++ dans un environnement W7x64, mais il existe certainement des options qui ne parviennent tout simplement pas à effectuer un service utile.