2017-12-17 12 views
4

In den meisten Fällen beim Debuggen, wenn ich einen Vektor (in Xcode 9) habe, wird mir eine Liste von Indizes angezeigt, die die Werte im Vektor darstellen.LLDB zeigt manchmal Vektordaten und andere Zeiten nicht

Wunsch enter image description here

Andere Zeiten, bekomme ich diese nicht hilfreich Darstellung:

Unerwünschte enter image description here

Ich bin nicht in der Lage, um herauszufinden, welche Bedingungen LLDB verursachen Vektoren in die angezeigt werden unerwünschter Weg.

Frage
Was verursacht das unerwünschte Verhalten? Kann es behoben werden, ohne den Code neu zu schreiben? Ist das ein Fehler in LLDB?

Hier ist ein kurzes Codebeispiel, das unerwünschte Verhalten reproduziert:

#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; 
} 


Hier ist ein Link auf das Xcode-Projekt:
http://s000.tinyupload.com/?file_id=21020556485232357417

+0

Der einzige offensichtliche Unterschied zwischen den beiden ist, dass man ein vollständiger STL-Typ ist - ein Vektor von eindeutigen Zeigern auf Ints. Die zweite betrifft einen benutzerdefinierten oder Drittanbieterbibliothekstyp. Wenn XCode den Typ "Imxr :: MxrLinked [List?]" Nicht parsen kann, gibt es vielleicht den Partring des eindeutigen ptr/vectors zusammen? – jwimberley

+0

Ich habe die Frage bearbeitet, um deutlicher zu machen, dass dies nicht das Problem ist. Lass mich wissen, ob die Bearbeitung geholfen hat. –

+0

Mit welchen Optimierungen kompilieren Sie? – Niall

Antwort

3

Dies ist ein bekannter Fehler in der Formatierung der std :: vector Datenzusammenfassung & für Referenzvariablen. Beachten Sie, dass in der expr v der Ausdruck Parser tatsächlich v als einen geraden Vektor, nicht eine Referenz auf einen Vektor betrachtet ... Deshalb funktioniert das Drucken.

+0

Gibt es einen offenen Fehlerbericht davon? Wenn dies der Fall ist, würde ein Link die Antwort vervollständigen. –

+1

Es gibt einen Fehler im Apple Bug Reporter-System, der aber nur für denjenigen sichtbar ist, der den Fehler gemeldet hat. Ich habe keinen ähnlichen Fehler im http://llvm.org/bugs Tracker gefunden. Es würde sich lohnen, eins hinzuzufügen, falls jemand extern die Zeit hat, es zu reparieren, bevor wir es erreichen. –

3

Sorry, füge ich meinen Kommentar hier in der Antworten, da Stack Overflow-Kommentare die Formatierung nicht unterstützen.

Es ist definitiv das Problem der lldb. Ihre Bilder enthalten nicht die volle v Beschreibung:

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

Die size=1 ist falsch. Neben dem Druckbefehl in der LLDB Konsole druckt v richtig:

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

Es scheint Xcode den LLDB frame var Befehl verwendet Variablen angezeigt werden soll. Dies zeigt genau die gleiche Leistung, die von Xcode angezeigt:

(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 
     } 
    } 
    } 
} 

Ich denke, die Frage kommt von der Tatsache, dass der Variable v wurde zunächst in einem anderen Stapelrahmen erstellt und initialisiert, so dass einige Informationen über den Vektor sind unbekannt in der untere Stapelrahmen, wenn der Anfangsvektor als Ergebnis des Funktionsaufrufs übergeben wurde.

Verwandte Themen