Nie, to nie jest możliwe i byłoby bardzo nieefektywne do wdrożenia.
Debugger na ogół obsługują dwa rodzaje przerwań:
- Hardware breakpoints: Debuger pyta CPU podnieść specjalny przerwanie wyjątku, gdy wystąpi jakieś zdarzenie, jak pewnego miejsca w pamięci ulegnie zmianie.
- Software Breakpoints: Debuger zastępuje opcodu na adres Breakpoint ze specjalną instrukcją "trap" (
int 3
/0xcc
na architekturze x86).
Dopasowanie kodu operacji instrukcji bieżącej wymaga albo obsługi procesora, aby wstawić punkt przerwania sprzętowego, albo debugger musi znać adres, aby użyć punktu przerwania oprogramowania.
Teoretycznie debugger mógłby po prostu przeszukać całą pamięć dla sekwencji bajtów instrukcji, ale ponieważ sekwencja bajtów może również wystąpić w środku instrukcji lub danych, może uzyskać fałszywe alarmy.
Ponieważ instrukcje dotyczące montażu mają zmienną długość, kontrola może przejść do dowolnego adresu lub kod sam się modyfikuje, nie jest też trywialne zdemontowanie całego obszaru pamięci w celu znalezienia konkretnej instrukcji.
W zasadzie jedynym sposobem niezawodnego znalezienia instrukcji w dowolnym kodzie montażu byłby pojedynczy krok na poziomie instrukcji. Byłoby to niezwykle kosztowne, nawet banalne wywołanie biblioteki, takie jak printf()
, mogłoby zająć kilka minut na dzisiejszym sprzęcie, jeśli wykonasz jedną instrukcję krok po kroku.
* „... i byłoby bardzo nieefektywne do wdrożenia.” * - Nie jestem tego pewien. Naiwna implementacja może być nieskuteczna, podobnie jak ciąg porównywania każdego mnemonika po uruchomieniu. Ale prośba GDB o zrobienie tego, co zaproponował rosyjski pracownik, wydaje się rozsądna. W moim przypadku chcę przerwać połączenia do 'CPUID'. Jest tylko cztery lub pięć połączeń do niego, więc wygląda na to, że GDB robi to, co sugerował Employed Russian, więc nie muszę tracić czasu. – jww