2017-12-17 30 views
4

デバッグ時に、(Xcode 9の)ベクトルがある場合、ベクトルの値を表すインデックスのリストが表示されます。私は条件がLLDBは内のベクトルを表示させるかを把握することができません enter image description hereLLDBがベクトルデータを表示することがあり、それ以外の時間が表示されない場合があります。

望ましくない:

理想 enter image description here

他の回は、私はこの役に立たない表現を取得します望ましくない方法。

質問
望ましくない動作の原因は何ですか?コードを書き直すことなく修正できますか?これはLLDBのバグですか?ここで

は、望ましくない動作を再現する短いコード例である:ここで

#include <iostream> 
#include <vector> 

std::vector<int> createVector() 
{ 
    std::vector<int> v = { 1, 2, 3 }; 
    return v; 
} 

int main(int argc, const char * argv[]) 
{ 
    const auto& v = createVector(); 
    std::cout << v.front() << std::endl; 
    return 0; 
} 


は、Xcodeプロジェクトへのリンクです:
http://s000.tinyupload.com/?file_id=21020556485232357417

+0

2つの間の唯一の明白な違いは、完全にSTL型であることです。つまり、intへの一意なポインタのベクトルです。 2つ目は、カスタムまたはサードパーティのライブラリタイプです。おそらくXCodeが "Imxr :: MxrLinked [List?]"型を解析する方法を知らない場合、それは一意のptr/vectorを完全に解析することをやめますか? – jwimberley

+0

これは問題ではないことをより明確にするために質問を編集しました。編集が助けになったら教えてください。 –

+0

どの最適化をコンパイルしますか? – Niall

答えて

3

これは、std :: vectorデータサマリー&フォーマッタが参照変数としてどのように機能するかに関する既知のバグです。 expr vでは、式パーサーは実際にはvを直線ベクトルとみなし、ベクトルへの参照ではないと考えていることに注意してください。

+0

オープンなバグレポートがありますか?そうであれば、リンクは答えを完了する。 –

+1

Apple Bug Reporterシステムにはバグがありますが、そのバグを報告した人は外部からしか見ることができません。私はhttp://llvm.org/bugsトラッカーで同等のバグを見つけられませんでした。外部に誰かがそれを直す前にそれを修正する時間がある場合に備えて、それを追加する価値があります。 –

3

申し訳ありませんが、私はここで私のコメントを追加しますスタックオーバーフローのコメントは書式設定をサポートしていないため、答えます。

間違いなくlldbの問題です。

v = (const std::__1::vector<int, std::__1::allocator<int> > &) size=1 

size=1間違っています:あなたの写真には、完全なVの記述が含まれていません。 lldbコンソール印刷物の印刷コマンドに加え v正しく:

(lldb) p v 
(const std::__1::vector<int, std::__1::allocator<int> >) $1 = size=3 { 
    [0] = 1 
    [1] = 2 
    [2] = 3 
} 

Xcodeの変数を表示するには、lldb frame varコマンドを使用していそうです。これは、Xcodeので表示され、まったく同じ出力が表示さ:

(lldb) frame variable -T 
(int) argc = 1 
(const char **) argv = 0x00007fff5fbff710 
(const std::__1::vector<int, std::__1::allocator<int> > &) v = size=1: { 
    (std::__1::__vector_base<int, std::__1::allocator<int> >) std::__1::__vector_base<int, std::__1::allocator<int> > = { 
    (std::__1::__vector_base<int, std::__1::allocator<int> >::pointer) __begin_ = 0x000000010103fa40 
    (std::__1::__vector_base<int, std::__1::allocator<int> >::pointer) __end_ = 0x000000010103fa4c 
    (std::__1::__compressed_pair<int *, std::__1::allocator<int> >) __end_cap_ = { 
     (std::__1::__libcpp_compressed_pair_imp<int *, std::__1::allocator<int>, 2>) std::__1::__libcpp_compressed_pair_imp<int *, std::__1::allocator<int>, 2> = { 
     (int *) __first_ = 0x000000010103fa4c 
     } 
    } 
    } 
} 

を私はこのように、ベクターに関するいくつかの情報が未知である、問題は変数vが最初に別のスタックフレームで作成され、初期化されたという事実から来ていると思います関数呼び出しの結果として初期ベクトルが渡されたときの下位スタックフレーム。

関連する問題