Qt-datastructuren afdrukken (QList, QString, etc.) in XCode 3.xx GDB

Ik probeer sommige Qt-containers in XCode te debuggen en de resultaten die ik van GDB krijg zijn niet nuttig:

    print l1
$1 = (QSharedPointer > &) @0x102780650: {
   >> = {
     >> = {
      value = 0x1161e47e0
    }, 
    members of QtSharedPointer::ExternalRefCount >: 
    d = 0x1161ace00
  }, }
Current language:  auto; currently c++
(gdb) print strQuery
$2 = {
  d = 0x1161e2890

Hoe krijg ik wat bruikbare resultaten van l1 (QList) en strQuery (QString)?
Ik heb al geprobeerd om deze .gdbinit te gebruiken, die een aantal macro's zoals "printq4string" toevoegt, maar die zijn vrij pijnlijk om te gebruiken, want bij het afdrukken van structs moet ik dit handmatig uitvoeren op elke ledvariabele.

4
Hoe debugde je deze variabelen? Is dit een terminaluitvoer van GDB na een verklaring in uw code? Kent u de methode qDebug() << ... ?
toegevoegd de auteur leemes, de bron
Ik gebruik afdrukken in GDB, ja ik weet qDebug (), maar de compileertijd en volledig onzichtbaar als de enige tool voor foutopsporing. Ik gebruik het via std :: cerr, maar de qDebug() algemeen is beperkter.
toegevoegd de auteur user805547, de bron

3 antwoord

Oké, dit maakte me gek, maar ik heb het.

First make sure your project is set to compile with GCC 4.2 and not pure LLVM as shown in : enter image description here

LLVM is nu ingesteld als de standaardcompiler in XCode 4 en het voegt geen correcte foutopsporingsinformatie toe voor struct binnen klassen.

Voeg nu in je ~/.gdbinit gewoon toe:

define pqts
    printf "(QString)0x%x (length=%i): \"",&$arg0,$arg0.d->size
    set $i=0
    while $i < $arg0.d->size
        set $c=$arg0.d->data[$i++]
        if $c < 32 || $c > 127
                printf "\\u0x%04x", $c
        else
                printf "%c", (char)$c
        end
    end
    printf "\"\n"
end

en je kunt nu eenvoudig pqts s1 typen en het zal je QString netjes dumpen.

1
toegevoegd
Ik heb Qstrings aan het werk gekregen, maar ik wil het nu voor alle native types werken, qMaps, qLists, en ook als ik een qlist print, wil ik dat het recursief en slim genoeg is om de snaren te begrijpen
toegevoegd de auteur user805547, de bron

Ik gebruik over het algemeen p * varName.shd die het als een QShared dumpt met de stringgegevens erin, maar ik weet niet zeker of dat voor QList zal werken, zeker voor QString.

0
toegevoegd

Ik las de bron en kwam met deze suboptimale aanpak, ik laat het aan de gemeenschap over om dit te verbeteren:

    QString s1("This should be easy");

    QList s;
    s.push_back("Can you debug me?");

(gdb) print/c s1.d.data[0]@30
$2 = {84 'T', 104 'h', 105 'i', 115 's', 32 ' ', 115 's', 104 'h', 111 'o', 117 'u', 108 'l', 100 'd', 32 ' ', 98 'b', 101 'e', 32 ' ', 101 'e', 97 'a', 115 's', 121 'y', 0 '\0', 0 '\0', 0 '\0', 0 '\0', 0 '\0', 0 '\0', 0 '\0', 0 '\0', 14 '\016', 0 '\0', 0 '\0'}

(gdb) print/c ((QString*)s.d.array).d.data[0]@20
$12 = {67 'C', 97 'a', 110 'n', 32 ' ', 121 'y', 111 'o', 117 'u', 32 ' ', 100 'd', 101 'e', 98 'b', 117 'u', 103 'g', 32 ' ', 109 'm', 101 'e', 63 '?', 0 '\0', 0 '\0', 0 '\0'}
0
toegevoegd
hoe krijg je dit data-object van s1.d? alles wat ik krijg is geen lid met de naam 'data' in 'QListData :: Data'? Dit vermoordt me
toegevoegd de auteur apouche, de bron