10.4では、C++Builderで、Windows 64-bit向けに完全に新しいデバッガが追加され、STLや他のデータ型の内容のインスペクト機能の大幅な改善と安定性の向上を実現します。

新しいデバッガ

詳細を掘り下げる前に、10.4で出荷するものを以下に示します。最新のLLDBに基づいており、複雑なSTLおよびその他の型の評価をサポートするC++ Win64用の新しいデバッガーです。この複雑な型のサポートは、独自の複雑なデータ構造を扱う場合にも完全に拡張できます。これは、デバッガーの安定性の点でも、デバッグ時に使用できるデータの点でも、生産性を大幅に向上させます。

Windows上でのC++デバッグに関する歴史的経緯

RAD Studioでは、アプリケーションのビルドに使用しているプログラミング言語と、ターゲットプラットフォームとそのビット数によって、使用するデバッガとデバッグ情報のファイル形式を決定しています。特に注意が必要なプラットフォームは、Win64 C++です。これは、デバッガテクノロジーとClangコンパイラによる副作用という2つの理由によるものです。

問題

10.4以前は、Win64上のC++では、DWARF v2デバッグ形式とカスタムデバッガを使用していました。

通常、ブログ記事で特定の問題にフォーカスすることはありませんが、歴史的に見ると、このデバッガには問題がないわけではありませんでした。お客様の中には、「disconnected session(セッションの切断)」エラーに遭遇しているかもしれません。これは、デバッガがエラーないしはクラッシュしていることを示しています(アプリケーション自身のエラーで、デバッガがハンドルできなくなったケースもあります)。IDEがしばらくフリーズしてしまったように見えるときは、実際には、IDEがデバッガのタイムアウト待ちになっているのです。

複雑なデータ型のインスペクト/評価

さらに、デバッグモードでも最適化が実行されているため、STL型などの構造の内容を検査することが困難でした。文字列を評価する必要のある c_str() などのメソッド呼び出しでも、メソッドがリンクされていないため評価できない場合があり、デバッガで扱えない場合もあります。std::vector や std::map などの他の型でも、アクセッサメソッドがインライン化されているか、そうでない場合もリンクされてない場合があり、いずれのケースでもデバッガで呼び出し可能なメソッドとして扱えません。

そのため、ツールチップ式評価、ローカル変数、評価/変更、監視式などの機能で、これらのコンテナ要素を表示することが困難でした。その結果、データの評価や可視化が容易ではないケースが生じていました。

こうした問題は、C++Builder固有の問題ではありませんでした。他のIDEでも同様に発生しており、対応に苦慮しているC++で共通する問題なのです(例: Visual Studio CodeVisual StudioJetBrainsgcc)。

10.4では、C++向けに新しいデバッガを導入することで、これらの問題の両方に対処しました。このデバッガは、LLDBの新バージョンをベースとしており、最新のデバッグ形式を用い、安定性があり、一般的なSTL型をはじめ複雑なデータ型を扱え、拡張性を備えています。

新しいC++デバッガ

まず、技術的なポイントを説明しましょう。10.4では、C++Builderは、Windows 64-bitのデバッグ向けに、カスタマイズバージョンのLLDB v9を使用しています。私の知る限り、エンバカデロは、LLDB for Windowsをサポートした最初のベンダーです。他のプラットフォームではすでにデファクトとなっていますが、まだWindowsでは普及していません(エンバカデロでは、2012年にC++Builder XE3向けのClang 3.1で、Clang for Windowsを初めてサポート/リリースしています)。

今回、LLDBとDWARF v4を組み合わせていますが、DWARF v5ではなくv4を使用したのは、Clangコンパイラを使用する上でのさまざまな技術的な理由によるものです。その結果、デバッグ情報で利用できる内容が改善され、「表示」および「デバッグ」可能なものがより多くなります。

安定性については、Win64向けに以前使用していたデバッガよりも、大幅に改善されることを目標にしています。既知の問題として認識している古いデバッガの不安定要因は、新しいデバッガには存在しません。さらに、IDEでのデバッガのUX改善にも取り組み、より有益なエラーメッセージを表示するようにしました。

複雑なデータ型のデバッグ

現状、新しいデバッガは、モダンで安定性があり、大変よい感触です。もっともすばらしい点は、STLや他の複雑なデータ型をサポートするなど、デバッグ機能が改善されていることです。C++Builder 10.4を用いれば、ベクター、マップ、文字列などのデータを容易に評価、確認できます。

要約すると、あらゆるC++ツールチェインで、C++向けに複雑なデータ型をインスペクト/評価することを困難にしているのには、いくつかの理由があります。まず、そのデータ構造が複雑すぎること。std::map の要素を検出するのは容易ではなく、たとえ文字列であっても、その要素は2つの異なる場所に存在する可能性があります。これは、手作業でデータを見つけるのが容易ではないことを意味します。もうひとつは、要素にアクセスするために使用するメソッドは、デバッガによってもアクセス可能にする必要がある点です。一度も呼び出されないメソッドは、最適化されてしまいます。呼び出されたメソッドは、STLの「ヘッダのみで構成されている」という特性から、デバッグビルドであってもインライン化されてしまいます。リンクされていないメソッドやインライン化されたメソッドは(独立したメソッドとして存在していないため)呼び出すことができないので、デバッガでは使用できません。その結果、データレイアウトやデータをラッピングするメソッドが分からないため、デバッガは文字列の中身や、ベクターのn番目の要素を評価するといったことができない場合があるのです。

C++Builder 10.4では、LLDBフォーマッターを使用することで、この問題を解決しています。複雑なデータ型のために、データ構造を理解する小さなPythonスクリプトが用意されています。デバッガはこれを呼び出しており、ツールチップ、監視式、評価/変更、インスペクト、ローカル変数ビューのデータ表示は、このスクリプトによって返される値です。

上記の画像は、10.4のWin64 C++デバッガで、いくつかの異なる文字列型(STL ナロー文字列、ワイド文字列、Unicode String、DelphiのUTF8 String)の値を表示したものです。shared_ptrは、その内容とポインタが指し示す先の両方を表示しています。また、弱い参照を含む参照カウントも表示しています。std::mapは、STLコンテナで最も複雑な内容になります。

10.4では、以下のフォーマッターを提供しています。

  • std::string
  • std::wstring
  • std::vector
  • std::deque
  • std::map
  • std::shared_ptr
  • UTF8Stringを含むAnsiString型
  • String/UnicodeString
  • WideString

これらのデータ型は、STLコンテナで最も一般的に使用されるもので、これとSTL文字列型は広く使われているものの、従来はその評価で問題を抱えていました。また、スマートポインタは、その参照先だけでなく、より多くの情報があると便利です。Delphiの文字列型も同様です。つまり、これらは可視化においては、より多くの情報が必要となる高度なデータセットです(すべてのデータ型がこれに該当するというわけではなく、平均的な構造体やクラスでは問題がありません。そのため、フォーマッターを必要とすることなく、改善されたデバッグ形式やデバッガのメリットを活かせます。フォーマッターは、メモリレイアウトやデバッグメソッドを必要とする複雑なデータ型で役立ちます)。

このスクリプトは、自分で書くこともできます。アプリケーションで複雑なデータ型を扱い、その評価で問題があった場合には、データ型内部でどのようにデータが表現されているかを記述できます。つまり、デバッガは完全に拡張可能なのです。

まとめ

C++Builder 10.4では、新たにWin64向けデバッガを導入します。最近のLLDBバージョンをベースとし、安定性とモダンな機能を提供します。主要なSTLデータ型を含む、複雑なデータ型の評価を実現するフォーマッターを搭載しています。私たちのゴールは、10.4でのデバッグのエクスペリエンスの安定性を高め、より強力な機能を提供することです。そして、デバッグ作業をスムーズに行い、必要な情報を表示できるようにすることで、生産性の大幅な向上を実現することを目指しています。

この新機能の提供を予定しているC++Builder 10.4のリリースに、ぜひご期待ください。


この記事は、RAD Studioの将来のリリースに関するプレビューです。製品品質やスケジュール等の理由により、紹介した機能の提供が変更になる可能性があります。製品が正式にリリースされるまで、最終的な機能、スペック等について保証されません。

Reduce development time and get to market faster with RAD Studio, Delphi, or C++Builder. Design. Code. Compile. Deploy.

Start Free Trial   Free Delphi Community Edition   Free C++Builder Community Edition   Upgrade Today  

Anonymous