La storia di un hacker
La data è il 12/02/10. I giorni prima di Natale stanno scivolando via e ho praticamente colpito un blocco stradale importante come programmatore di Windows. Ho usato AQTime, ho provato assonnato, brillante e molto assonnato, e mentre parliamo, VTune si sta installando. Ho provato ad usare il profiler VS2008 ed è stato punito positivamente e spesso insensibile. Ho usato la tecnica di pausa casuale. Ho esaminato gli alberi di chiamata. Ho sparato tracce di funzione. Ma il triste fatto doloroso della questione è che l'app con cui sto lavorando è oltre un milione di righe di codice, con probabilmente un altro milione di righe di app di terze parti.
Ho bisogno di strumenti migliori. Ho letto gli altri argomenti. Ho provato ogni profiler elencato in ogni argomento. Deve semplicemente esserci qualcosa di meglio di queste opzioni schifose e costose, o ridicole quantità di lavoro per quasi nessun guadagno. Per complicare ulteriormente le cose, il nostro codice è fortemente intrecciato ed esegue una serie di loop di eventi Qt, alcuni dei quali sono così fragili da bloccarsi in presenza di strumenti pesanti a causa di ritardi temporali. Non chiedermi perché stiamo eseguendo più loop di eventi. Nessuno può dirmelo.
Esistono opzioni più simili a Valgrind in un ambiente Windows?
C'è qualcosa di meglio della lunga serie di strumenti rotti che ho già provato?
Esiste qualcosa progettato per integrarsi con Qt, forse con una utile visualizzazione degli eventi in coda?
Un elenco completo degli strumenti che ho provato, con quelli davvero utili in corsivo:
- AQTime: piuttosto buono! Ha qualche problema con la ricorsione profonda, ma il grafico della chiamata è corretto in questi casi e può essere usato per chiarire qualsiasi confusione che potresti avere. Non è uno strumento perfetto, ma vale la pena provarlo. Potrebbe soddisfare le tue esigenze, e sicuramente è stato abbastanza buono per me la maggior parte del tempo.
- Attacco Pausa casuale in modalità debug: informazioni insufficienti abbastanza spesso.
Un buon strumento ma non una soluzione completa. - Parallel Studios: l'opzione nucleare. Invadente, strano e follemente potente. Penso che dovresti iniziare la valutazione di 30 giorni e capire se è adatta. È anche dannatamente bello.
- AMD Codeanalyst: meraviglioso, facile da usare, molto soggetto a crash, ma penso che sia una cosa ambientale. Consiglierei di provarlo, in quanto è gratuito.
- Luke Stackwalker: funziona bene su piccoli progetti, sta un po 'cercando di farlo funzionare sui nostri. Alcuni buoni risultati però, e sicuramente sostituisce Sleepy per i miei compiti personali.
- PurifyPlus: nessun supporto per ambienti Win-x64, in particolare Windows 7. Altrimenti eccellente. Alcuni miei colleghi di altri dipartimenti lo giurano.
- Profilatore VS2008: produce output nell'intervallo 100+ in modalità traccia funzioni alla risoluzione richiesta. Tra i lati positivi, produce risultati solidi.
- GProf: richiede che GCC sia anche moderatamente efficace.
- VTune: il supporto W7 di VTune confina con i criminali. Altrimenti eccellente
- PIN: dovrei hackerare il mio strumento, quindi questa è una specie di ultima risorsa.
- Sleepy \ VerySleepy: utile per le app più piccole, ma non mi riesce qui.
- EasyProfiler: non male se non ti dispiace un po 'di codice iniettato manualmente per indicare dove strumenti.
- Valgrind: * solo nix, ma ottimo quando ci si trova in quell'ambiente.
- OProfile: solo Linux.
- Proffy: sparano a cavalli selvaggi.
Strumenti suggeriti che non ho provato:
- XPerf:
- GlowCode:
- DevPartner:
Note: ambiente Intel al momento. VS2008, boost librerie. Qt 4+. E il miserabile colonnello di tutti: integrazione Qt / MFC via trolltech.
Ora: quasi due settimane dopo, sembra che il mio problema sia stato risolto. Grazie a una varietà di strumenti, incluso quasi tutto nella lista e un paio di miei trucchi personali, abbiamo trovato i principali colli di bottiglia. Tuttavia, continuerò a testare, esplorare e provare nuovi profiler e nuove tecnologie. Perché? Perché lo devo a voi ragazzi, perché voi ragazzi rock. Rallenta un po 'la sequenza temporale, ma sono ancora molto entusiasta di continuare a provare nuovi strumenti.
Sinossi
Tra molti altri problemi, alcuni componenti sono stati recentemente passati al modello di threading errato, causando gravi blocchi a causa del fatto che il codice sottostante non è stato improvvisamente più multithread. Non posso dire altro perché viola la mia NDA, ma posso dirti che questo non sarebbe mai stato trovato da un'ispezione casuale o anche dalla normale revisione del codice. Senza profiler, calligrafi e pause casuali insieme, continueremmo a urlare la nostra furia per il bellissimo arco blu del cielo. Per fortuna, lavoro con alcuni dei migliori hacker che abbia mai incontrato, e ho accesso a un versetto fantastico pieno di strumenti fantastici e persone fantastiche.
Gentile gente, lo apprezzo moltissimo, e mi pento solo di non avere abbastanza rappresentante per premiare ognuno di voi con una generosità. Penso ancora che questa sia una domanda importante per ottenere una risposta migliore rispetto a quelle che abbiamo avuto finora su SO.
Di conseguenza, ogni settimana per le prossime tre settimane, metterò la taglia più grande che posso permettermi e assegnandola alla risposta con lo strumento più bello che penso non sia conoscenza comune. Speriamo che dopo tre settimane avremo accumulato un profilo definitivo dei profiler, se perdonerai la mia punizione.
Take-away
Usa un profiler. Sono abbastanza buoni per Ritchie, Kernighan, Bentley e Knuth. Non mi interessa chi pensi di essere. Usa un profiler. Se quello che hai non funziona, trovane un altro. Se non riesci a trovarne uno, codificane uno. Se non riesci a codificarne uno, o è un piccolo problema, o sei semplicemente bloccato, usa una pausa casuale. Se tutto il resto fallisce, assumere alcuni studenti laureati per sbattere un profiler.
Una visione più lunga
Quindi, ho pensato che sarebbe stato bello scrivere un po 'di una retrospettiva. Ho scelto di lavorare ampiamente con Parallel Studios, in parte perché in realtà è basato sullo strumento PIN. Avendo avuto rapporti accademici con alcuni dei ricercatori coinvolti, ho sentito che questo era probabilmente un segno di qualità. Per fortuna, avevo ragione. Mentre la GUI è un po 'terribile, ho trovato IPS incredibilmente utile, anche se non posso consigliarlo comodamente a tutti. Criticamente, non esiste un modo ovvio per ottenere il numero di hit a livello di linea, cosa fornita da AQT e da un certo numero di altri profiler, e ho trovato molto utile per esaminare, tra le altre cose, il tasso di selezione delle filiali. In rete, mi è piaciuto anche usare AQTime e ho trovato il loro supporto molto reattivo. Ancora una volta, devo qualificare la mia raccomandazione: Molte delle loro funzioni non funzionano così bene, e alcune di esse sono decisamente soggette a crash su Win7x64. Anche XPerf ha funzionato egregiamente, ma è stranamente lento per i dettagli di campionamento richiesti per ottenere buone letture su alcuni tipi di applicazioni.
In questo momento, dovrei dire che non penso che ci sia un'opzione definitiva per la profilazione del codice C ++ in un ambiente W7x64, ma ci sono certamente opzioni che semplicemente non riescono a eseguire alcun servizio utile.