カスタムの C++ コンテナー タイプがあり、Xcode 変数ビューの外観を変更したいと考えています。方法に似たものを作るか、NSArray
そこstd::vector
を見る必要があります。
今のところ、要約文字列を出力コンテナー サイズに変更することしかできず、コンテナーの子をインデックス付きのツリーに配置する方法がわかりません。デフォルトのビューは、コンテナ ivar を出力します。
LLDB Python スクリプトを使用してツリーにコンテナの子を出力することは可能ですか?
はい、そうです。
あなたが探している機能は「合成子」と呼ばれ、基本的に Python クラスをデータ型にバインドする必要があります。LLDB は、現在行われているようにデバッグ情報を信頼する代わりに、子オブジェクト (コンテナー内の要素) を販売する必要がある場合に、クラスへの問い合わせに進みます。1 つのわずかな違い [1] を除いて、これは LLDB が NSArray、std::vector およびその他のいくつかに対して行うことと同じです。
[1] よく知られているシステム タイプの合成子プロバイダは C++ で記述されており、主にパフォーマンス上の理由から LLDB コアの一部です。
独自のロールを作成するには、この仕様に従うクラスを実装する必要があります。
class SyntheticChildrenProvider:
def __init__(self, valobj, internal_dict):
this call should initialize the Python object using valobj as the variable to provide synthetic children for
def num_children(self):
this call should return the number of children that you want your object to have
def get_child_index(self,name):
this call should return the index of the synthetic child whose name is given as argument
def get_child_at_index(self,index):
this call should return a new LLDB SBValue object representing the child at the index given as argument
def update(self):
this call should be used to update the internal state of this Python object whenever the state of the variables in LLDB changes.[1]
def has_children(self):
this call should return True if this object might have children, and False if this object can be guaranteed not to have children.[2]
[1] このメソッドはオプションです。また、オプションで値を返すことを選択することもできます (SVN rev153061/LLDB-134 以降)。値が返され、その値が True の場合、LLDB は子をキャッシュすることが許可され、子は以前に取得した値をカウントし、プロバイダー クラスに戻って問い合わせることはありません。何も返されないか、None、または True 以外が返された場合、LLDB はキャッシュされた情報を破棄して問い合わせます。とにかく、必要なときはいつでも、LLDB は update を呼び出します。[2] このメソッドはオプションです (SVN rev166495/LLDB-175 以降)。num_children の観点から実装することは許容されますが、実装者は合理的な場合は常に最適化されたコーディングの代替案を探すことをお勧めします。
詳細はhttp://lldb.llvm.org/varformats.htmlにあり、開始点として使用できるいくつかのサンプル実装へのリンクが含まれています。
追加の質問がある場合、またはさらに詳しいガイダンスが必要な場合は、お気軽に ping を送信してください。