Podczas debugowania ostatnio zauważyłem, że GDB ma możliwość oceny "złożonych" wyrażeń podczas debugowania programu i zastanawiam się, jak to robi. Na przykład za pomocą następującego kodu:W jaki sposób GDB ocenia wyrażenia C++ w czasie wykonywania
int main() {
std::vector<int> v = {1, 2, 3};
int k = 0;
std::cin >> k;
v.push_back(k);
return v.at(0);
}
jestem w stanie skompilować program g++ -g myprogram.cpp
i debugowanie w GDB, które pozwala mi wpisać takie rzeczy print v.at(4);
(wyświetlającą prawidłową wartość po k
dynamicznie weszła) i print v.at(2) == 3
co jest prawdziwe.
Zastanawiam się, jak GDB to robi. This SO question podpowiada, że jest to coś "skompilowanego w pamięci", ale nie rozwija się dalej, więc zastanawiam się, czy używa on jakiegoś rodzaju JIT, aby to wszystko działało, czy coś innego? Czy kompilują kod podczas wpisywania go i uruchamiania? Czy mają one framework do oceny C++ w locie w kontekście debugowania? Zasadniczo chcę to powtórzyć w debuggerze, który piszę, aby ocenić wyrażenia w punktach przerwania, dlatego jestem ciekawy, jak GDB to robi.
Nie jest dla mnie jasne, jaką odpowiedź masz nadzieję uzyskać. Gdb potrafi analizować wyrażenia C i C++ w kontekście debugowanego programu, korzystając z informacji debugowania zawartych w pliku binarnym, a także z wykorzystaniem kodu źródłowego, gdy jest on dostępny. Ale już to wiedziałeś, a szczegóły będą zbyt długie dla tego miejsca. –
@JohnBollinger Pomyślałem, że będę musiał "użyć źródła", ale zastanawiam się, jak oceniają wyrażenia. Czy kompilują kod podczas wpisywania go i uruchamiania? Czy mają one framework do oceny C++ w locie w kontekście debugowania? Zasadniczo chcę to powtórzyć w debuggerze, który piszę, aby ocenić wyrażenia w punktach przerwania, dlatego jestem ciekawy, jak GDB to robi. Dzięki! – llk
Twoje pytanie wydaje się być bardziej skoncentrowane na C++. Polecam usunąć tag C. – tambre