Débogage avec GDB¶
Code à déboguer¶
Nous utilisons dans cet article ce programme qui donne le nombre de personnes ayant un anniversaire commun.
Problème des anniversaires
// source: https://rosettacode.org/wiki/Birthday_problem#C++
#include <algorithm>
#include <iostream>
#include <random>
#include <vector>
double equalBirthdays(int nSharers, int groupSize, int nRepetitions) {
std::default_random_engine generator;
std::uniform_int_distribution<int> distribution(0, 364);
std::vector<int> group(365);
int eq = 0;
for (int i = 0; i < nRepetitions; i++) {
std::fill(group.begin(), group.end(), 0);
for (int j = 0; j < groupSize; j++) {
int day = distribution(generator);
group[day]++;
}
if (std::any_of(group.cbegin(), group.cend(), [nSharers](int c) { return c >= nSharers; })) {
eq++;
}
}
return (100.0 * eq) / nRepetitions;
}
int main() {
int groupEst = 2;
for (int sharers = 2; sharers < 6; sharers++) {
// Coarse
int groupSize = groupEst + 1;
while (equalBirthdays(sharers, groupSize, 100) < 50.0) {
groupSize++;
}
// Finer
int inf = (int)(groupSize - (groupSize - groupEst) / 4.0f);
for (int gs = inf; gs < groupSize + 999; gs++) {
double eq = equalBirthdays(sharers, groupSize, 250);
if (eq > 50.0) {
groupSize = gs;
break;
}
}
// Finest
for (int gs = groupSize - 1; gs < groupSize + 999; gs++) {
double eq = equalBirthdays(sharers, gs, 50000);
if (eq > 50.0) {
groupEst = gs;
printf("%d independant people in a group of %d share a common birthday. (%5.1f)\n", sharers, gs, eq);
break;
}
}
}
return 0;
}
La compilation avec l’option -g génère des symboles de débogage
g++ -g3 birthday_problem.cpp -o birthday_problem
Débogage pas à pas¶
Ajouter un point d’arrêt¶
Ajouter un point d’arrêt sur la fonction
main
Ajouter un point d’arrêt sur une ligne spécifique comme
birthday_problem.cpp:32
Exécuter le programme¶
Exécuter le programme avec la commande
run. Le débogueur s’arrête alors sur le premier point d’arrêt.
Les débogueurs permettent d’inspecter l’état du programme, y compris les variables et les fonctions, à tout moment de l’exécution. Vous pouvez ensuite choisir soit d’avancer ligne par ligne dans le code, soit de poursuivre l’exécution (voir l’exemple ci-dessous) jusqu’au prochain point d’arrêt.
Afficher une variable
Scripting¶
Deux exemples de scripts :