Was ist der Unterschied zwischen Hardware- und Software-Haltepunkten?
Sagt man, dass Hardware-Breakpoints schneller sind als Software-Breakpoints, wenn ja, wie, und warum brauchen wir dann überhaupt Software-Breakpoints?
Was ist der Unterschied zwischen Hardware- und Software-Haltepunkten?
Sagt man, dass Hardware-Breakpoints schneller sind als Software-Breakpoints, wenn ja, wie, und warum brauchen wir dann überhaupt Software-Breakpoints?
Dieser Artikel bietet eine gute Diskussion der Vor- und Nachteile: http://www.nynaeve.net/?p=80
Um Ihre Frage direkt zu beantworten: Software-Breakpoints sind flexibler, da Hardware-Breakpoints in einigen Funktionen eingeschränkt und stark architekturabhängig sind. Ein Beispiel, das in dem Artikel genannt wird, ist, dass x86-Hardware eine Begrenzung von 4 Hardware-Breakpoints hat.
Hardware-Breakpoints sind schneller, weil sie über eigene Register verfügen und weniger Overhead haben als Software-Breakpoints.
Hardware-Breakpoints sind eigentlich Komparatoren, die den aktuellen PC mit der Adresse im Komparator (wenn aktiviert) vergleichen. Hardware-Haltepunkte sind die beste Lösung für das Setzen von Haltepunkten. Sie werden in der Regel über die Debug-Sonde gesetzt (über JTAG, SWD, ...). Der Nachteil von Hardware-Breakpoints: Sie sind begrenzt. CPUs haben nur eine begrenzte Anzahl von Hardware-Haltepunkten (Komparatoren). Die Anzahl der verfügbaren Hardware-Breakpoints hängt von der CPU ab. ARM 7/9 Kerne haben 2, moderne ARM-Geräte (Cortex-M 0,3,4) zwischen 2 und 6, x86 normalerweise 4.
Software-Haltepunkte werden gesetzt, indem der zu haltende Befehl durch einen Haltepunktbefehl ersetzt wird. Der Haltepunktbefehl ist in den meisten CPUs vorhanden und normalerweise so kurz wie der kürzeste Befehl, also nur ein Byte auf x86 (0xcc, INT 3). Bei Cortex-M-CPUs sind die Anweisungen 2 oder 4 Byte lang, so dass die Haltepunktanweisung eine 2-Byte-Anweisung ist.
Software-Haltepunkte können leicht gesetzt werden, wenn sich das Programm im RAM befindet (z. B. auf einem PC). Bei vielen eingebetteten Systemen befindet sich das Programm im Flash-Speicher. Hier ist es nicht so einfach, die Anweisung auszutauschen, da der Flash-Speicher neu programmiert werden muss, daher werden hauptsächlich Hardware-Breakpoints verwendet. Die meisten Debug-Sonden unterstützen nur Hardware-Breakpoints, wenn sich das Programm im Flash-Speicher befindet. Einige (wie z.B. der J-Link von SEGGER) erlauben jedoch die Umprogrammierung des Flash-Speichers mit Breakpoint-Befehlen und erlauben auch eine unbegrenzte Anzahl von (Software-)Breakpoints, selbst wenn ein Programm im Flash-Speicher debuggt wird.
Weitere Informationen über Software-Haltepunkte im Flash-Speicher
Sie können durch GDB-Interna Es erklärt sehr gut die HW- und SW-Haltepunkte.
HW-Breakpoints sind etwas, das von der MCU unterstützt werden muss. Die ARM-Controller haben spezielle Register, in die man einen Adressraum schreiben kann, wenn PC (Programmzähler) == sp-Register die CPU anhält. Jtag ist normalerweise erforderlich, um in diese Spezialregister zu schreiben.
SW-Breakpoints werden in GDB implementiert, indem ein Trap, eine illegale Division oder eine andere Anweisung eingefügt wird, die eine Exception auslöst, und wenn diese auftritt, nimmt GDB die Exception und hält das Programm an. Wenn der Benutzer sagt, dass er weitermachen soll, stellt gdb die ursprüngliche Anweisung wieder her, macht einen Einzelschritt, fügt den Trap wieder ein und fährt fort.
Die Verwendung von HW-Debuggern bietet viele Vorteile gegenüber SW-Debuggern, insbesondere wenn Sie mit Interrupts und Speicherbusgeräten arbeiten. AFAIK können Interrupts nicht mit Software-Debuggern debuggt werden.
Zusätzlich zu den obigen Antworten ist es auch wichtig zu wissen, dass Software-Haltepunkte bestimmte Anweisungen im Programm überschreiben, um zu wissen, wo man anhalten muss, während die begrenztere Anzahl von Hardware-Haltepunkten tatsächlich Teil des Prozessors ist.
Justin Seitz in seinem Buch Grauer Hut Python weist darauf hin, dass der wichtige Unterschied darin besteht, dass Software-Breakpoints durch das Überschreiben von Anweisungen tatsächlich die CRC der Datei, und so kann jede Art von Programm, wie z.B. ein Stück Malware, das seinen CRC berechnet, sein Verhalten als Reaktion auf gesetzte Haltepunkte ändern, während es bei Hardware-Haltepunkten weniger offensichtlich ist, dass der Debugger anhält und durch bestimmte Codeabschnitte schreitet.
Kurz gesagt: Hardware-Breakpoints verwenden spezielle Register und sind daher in ihrer Anzahl begrenzt. Sie können sowohl im flüchtigen als auch im nichtflüchtigen Speicher gesetzt werden.
Software-Haltepunkte werden gesetzt, indem der Opcode eines Befehls im RAM-Speicher durch einen Haltepunktbefehl ersetzt wird. Diese können nur im RAM-Speicher gesetzt werden (der Flash-Speicher kann nicht beschrieben werden) und sind nicht begrenzt.
Dieser Artikel bietet eine gute Erklärung über Haltepunkte.
Vielen Dank und herzliche Grüße, Shivakumar V W
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.