Debuggen von C++Builder-Anwendungen für 64-Bit-Windows

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu C++Builder-Anwendungsentwicklung für 64-Bit-Windows


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.

Siehe auch