Debuggen von C++Builder-Anwendungen für 64-Bit-Windows
Nach oben zu C++Builder-Anwendungsentwicklung für 64-Bit-Windows
Inhaltsverzeichnis
C++Builder für 64-Bit-Windows Compiler (BCC64) erzeugt Debug-Informationen im DWARF-Format, das sich von dem Format, das von BCC32 und BCCOSX verwendet wird, unterscheidet. Im Allgemeinen entspricht das Debuggen von C++-Anwendungen für 64-Bit-Windows jedoch dem Debuggen von C++-Anwendungen für 32-Bit-Windows. Es gibt einige Unterschiede, die im Folgenden beschrieben werden:
- Einige Debugger-Funktionen werden nicht unterstützt. Das Debuggen von Eigenschaften, Closures, Klassenmethoden und anderen Erweiterungen der Delphi-Sprache wird derzeit nicht unterstützt.
- Beispielsweise werden im Debug-Inspektor die Registerkarten Methoden und Eigenschaften für C++-Anwendungen für 64-Bit-Windows nicht angezeigt.
- Unicode, Codeseiten und Lokalisierung werden nicht vollständig unterstützt.
- Beispielsweise wird Unicode nicht in Bezeichnernamen unterstützt, und Codeseiten werden nicht vom C++-Debugger für 64-Bit-Windows unterstützt.
- Bei der Auswertung eines 64-Bit-Windows-Registers muss dem Registernamen ein $ (z.B.
$rax
) vorangestellt werden.- Siehe Auswerten/Ändern.
- Funktionsaufrufe, die Exceptions auslösen, werden folgendermaßen behandelt:
- Wenn eine Funktion einen "try/except/catch"-Block enthält und während der Ausführung eine C++- oder OS/SEH-Exception ausgelöst wird, wird der Funktionsaufruf korrekt beendet, aber das Ergebnis ist undefiniert oder 0. In diesem Fall wird der interne Exception-Block nicht ausgeführt, weil die Exception direkt vom Debugger behandelt wird.
- Wenn eine Funktion einen "try/except/catch"-Block enthält und keine Sprach- oder OS/SEH-Exceptions ausgelöst werden, wird der Funktionsaufruf ordnungsgemäß beendet und das Ergebnis ist – abhängig von der Funktion – korrekt.
Unterschiede beim Aufruf-Stack
Manche Werte werden eventuell bei der 64-Bit-Auswertung anders als bei der 32-Bit-Auswertung angezeigt. Beispielsweise wird der Aufruf-Stack ohne Funktionsparameter und Werte angezeigt.
Der Aufruf-Stack enthält normalerweise zwei Kopien von jedem Konstruktor und Destruktor. Der Aufruf-Stack könnte z.B. Folgendes enthalten:
:0000000000401244 ; MyClass::~MyClass
- :0000000000401229 ; MyClass::~MyClass
- :0000000000401187 ; main
:000000000040ef90 ; _startup
- Hinweis: Clang implementiert das Itanium-ABI, das drei Konstruktoren und drei Destruktoren beschreibt, die sich nacheinander gegenseitig aufrufen. Clang implementiert aber nur zwei der drei Konstruktoren. Der dritte wird von C++Builder für Klassen im Delphi-Stil hinzugefügt. Siehe Itanium ABI doc (EN) oder diesen Beitrag: http://stackoverflow.com/questions/6921295/dual-emission-of-constructor-symbols (EN).
Auswerten von Funktionsaufrufen wie strcmp()
Die Auswertung eines Funktionsaufrufs, wie strcmp(str, "ABC"), könnte einen Fehler wie den folgenden zurückgeben:
#include <system.hpp> int main() { char *str = "ABC"; return strcmp(str, "ABC"); } error: 'strcmp' has unknown return type; cast the call to its declared return type error: 1 errors parsing expression
Sie müssen im Fenster Auswerten/Ändern den Rückgabetyp für strcmp() umwandeln:
(int) strcmp(str, "ABC");
Siehe strcmp, _mbscmp, wcscmp.