Lors du débogage, j'ai récemment remarqué que GDB a la capacité d'évaluer les expressions « complexes » lors du débogage d'un programme, et je me demande comment il le fait. Par exemple, avec le code suivant:Comment GDB évaluer les expressions de C lors de l'exécution
int main() {
std::vector<int> v = {1, 2, 3};
int k = 0;
std::cin >> k;
v.push_back(k);
return v.at(0);
}
Je suis en mesure de compiler le programme g++ -g myprogram.cpp
et le débogage dans GDB ce qui me permet de taper des choses comme print v.at(4);
(qui imprime la valeur correcte après k
est dynamiquement entré) et print v.at(2) == 3
ce qui évalue à vrai.
Je me demande comment GDB fait cela. This SO question laisse entendre que c'est quelque chose de "compilé en mémoire" mais ne précise pas davantage, alors je me demande s'il utilise une sorte de JIT pour que tout cela fonctionne ou autre chose? Est-ce qu'ils compilent le code en ligne pendant que je le tape et l'exécute? Ont-ils un cadre pour évaluer C++ à la volée dans le contexte de débogage? En substance, je veux reproduire ceci dans un débogueur que j'écris pour évaluer des expressions à des points de rupture, c'est pourquoi je suis curieux de savoir comment GDB le fait.
Je ne sais pas quel genre de réponse vous espérez obtenir. Gdb est capable d'analyser les expressions C et C++ dans le contexte du programme en cours de débogage, à l'aide de l'information de débogage contenue dans le binaire, et éventuellement aussi avec l'utilisation du code source lorsque celui-ci est disponible. Mais vous le saviez déjà, et les détails seraient beaucoup trop longs pour ce lieu. –
@JohnBollinger J'ai pensé que je devrais "utiliser la source", mais ce que je me demande, c'est comment ils évaluent les expressions. Est-ce qu'ils compilent le code en ligne pendant que je le tape et l'exécute? Ont-ils un cadre pour évaluer C++ à la volée dans le contexte de débogage? En substance, je veux reproduire ceci dans un débogueur que j'écris pour évaluer des expressions à des points de rupture, c'est pourquoi je suis curieux de savoir comment GDB le fait. Merci! – llk
Votre question semble être plus axée sur le C++. Je vous recommande de supprimer le tag C. – tambre