J'écris actuellement un algorithme multithread, hautement efficace et évolutif. Parce que je dois deviner un paramètre pour le code et je ne suis pas sûr de la façon dont le calcul fonctionne sur un ensemble de données spécifique, je voudrais regarder une variable. Le test ne fonctionne qu'avec un monde réel, un énorme ensemble de données. Il est possible d'analyser les données collectées après le profilage. Imaginez l'exemple, le code simple suivant (le code réel peut contenir des points de surveillance multiples:Surveillance efficace des variables en C/C++
// function get's called by loops of multiple threads
void payload(data_t* data, double threshold) {
double value = calc(data);
// here I want to watch the value
if (value < threshold) {
doSomething(data);
} else {
doSomethingElse(data);
}
}
Je pensais que sur les approches suivantes:
- En utilisant
cout
ou d'autres sorties système - Utilisez une sortie binaire (fichier, réseau)
- Définir un point d'arrêt via gdb/LLDB
- Utiliser observation variables + journalisation via gdb/LLDB
Je ne suis pas satisfait des résultats parce que: Pour utiliser 1. et 2. Je dois changer le code, mais c'est une tâche de débogage/évaluation. En outre 1. nécessite un verrouillage et 1. + 2. nécessite des opérations d'E/S, ce qui ralentit fortement l'ensemble du code et rend presque impossible le test avec des données réelles. 3. est également trop lent. Pour utiliser 4., je dois connaître l'adresse de la variable parce que ce n'est pas une variable globale, mais parce que les threads sont créés par un planificateur dynamique, cela nécessiterait de casser + stepping pour chaque thread. Donc, ma conclusion est, que j'ai besoin d'un profileur/débogueur qui fonctionne au niveau du code machine et dumps/logs/watches la variable sans conversion double-chaîne et est très efficace, ou pour résumer avec d'autres mots: voudrais profiler l'état interne de mon algorithme sans lourd ralentissement et sans faire de modification en profondeur. Est-ce que quelqu'un connaît un outil qui est capable de cela?
Sur Linux, le débogueur 'de gdb' a * watchpoints * (passe sa commande' watch') , implémenté en utilisant 'ptrace' –
Si la fonction est appelée par plusieurs threads, il y a peut-être plusieurs emplacements où' value' est stocké/mis à jour, n'est-ce pas? Pourriez-vous créer un tableau statique (emplacement connu) avec N éléments, où N = nombre de threads; puis copiez 'value' dans l'emplacement du tableau approprié pour le thread qui l'a appelé? Ensuite, vous n'avez qu'à regarder ce tableau pour toutes les valeurs. Si vous ne vous souciez pas si vous avez seulement une valeur, il pourrait s'agir d'un emplacement simple plutôt que d'un tableau - et encore une fois, vous pourriez alors regarder avec 'gdb'. – Floris
Il cesse certainement d'être très efficace et évolutif une fois que vous commencez à faire l'une de ces choses. Si vous ne pouvez pas utiliser une fonctionnalité de système d'exploitation intégrée, similaire à un compteur de performance ou à ETW sous Windows, vous devez commencer à penser à un tampon circulaire lu par un autre thread. –