C++Builder 64 ビット Windows アプリケーションのデバッグ
C++Builder 64 ビット Windows アプリケーションの開発 への移動
C++Builder 64 ビット Windows 版コンパイラ(BCC64)では、デバッグ情報を DWARF 形式で生成します。これは BCC32 および BCCOSX で使用しているものとは異なる形式です。しかしそれ以外の面では、C++ 64 ビット Windows アプリケーションのデバッグは、C++ 32 ビット Windows アプリケーションのデバッグと似ています。以下に示すように、相違点がいくつかあります。
- 一部のデバッガ機能がサポートされていません。プロパティ、クロージャ、クラス メソッドなどの Delphi 言語拡張機能のデバッグは現時点ではサポートされていません。
- たとえば、[デバッグ インスペクタ]では、C++ 64 ビット Windows アプリケーションの場合、[メソッド]タブと[プロパティ]タブが表示されません。
- Unicode、コード ページ、ローカライズは、完全にはサポートされていません。
- たとえば、Unicode は識別子名には使用できず、コード ページは C++ 64 ビット Windows 版デバッガではサポートされていません。
- 64 ビット Windows レジスタを評価する際には、
$rax
などのように、レジスタ名の先頭に $ を付ける必要があります。- 「[評価/変更]」を参照してください。
- 例外を送出する関数呼び出しは以下のように処理されます。
- 関数に try/except/catch ブロックが含まれていて、実行中に C++ 例外や OS/SEH 例外が発生した場合、その関数呼び出しは正常に終了しますが、結果は未定義か 0 になります。この場合は、例外がデバッガで直接処理されるため、内部の例外ブロックは実行されません。
- 関数に try/except/catch ブロックが含まれていて、言語例外や OS/SEH 例外が発生しない場合、その関数呼び出しは正常に終了し、結果は関数に応じて正しいものになります。
呼び出し履歴の違い
64 ビット評価モジュールでは、一部の値の表示が 32 ビット評価モジュールの場合とは異なる可能性があります。たとえば、呼び出し履歴の表示には、関数のパラメータと値が含まれません。
呼び出し履歴には、通常、各コンストラクタおよびデストラクタのコピーが 2 つずつ含まれています。 たとえば、呼び出し履歴に以下の内容が含まれているとしましょう。
:0000000000401244 ; MyClass::~MyClass
:0000000000401229 ; MyClass::~MyClass
:0000000000401187 ; main
:000000000040ef90 ; _startup
- メモ: Clang では Itanium ABI を実装していますが、これには、互いを連鎖的に呼び出す 3 つのコンストラクタと 3 つのデストラクタが記述されています。ただし、Clang では、これら 3 つのコンストラクタのうち 2 つしか実装されておらず、C++Builder では、この 3 つ目のコンストラクタが Delphi 形式のクラスに追加されています。詳細については、Itanium ABI のドキュメントか http://stackoverflow.com/questions/6921295/dual-emission-of-constructor-symbols の投稿を参照してください。
strcmp() などの関数呼び出しの評価
strcmp(str, "ABC") などの関数呼び出しを評価すると、以下のようなエラーが返されるおそれがあります。
#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
[評価/変更]ウィンドウでは、以下のように strcmp() の戻り値型をキャストする必要があります。
(int) strcmp(str, "ABC");
詳細については、「strcmp、_mbscmp、wcscmp」を参照してください。