7

XCodeでいくつかのQtコンテナをデバッグしようとしていますが、GDBから返される結果は役に立ちません。

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

l1(QList)とstrQuery(QString)から有用な出力を取得するにはどうすればよいですか?
「printq4string」のようないくつかのマクロを追加するこの.gdbinitを使用してみましたが、構造体を出力するときに各メンバー変数でこれを手動で実行する必要があるため、使用するのは非常に面倒です。

4

5 に答える 5

2

わかりました、これは私を狂わせましたが、私はそれを手に入れました。

まず、プロジェクトがGCC 4.2でコンパイルするように設定されていることを確認します。次に示すように、純粋なLLVMではありません。 ここに画像の説明を入力してください

LLVMはXCode4のデフォルトコンパイラとして設定されるようになり、クラス内の構造体の正しいデバッグ情報が追加されません。

〜/ .gdbinitに次を追加するだけです:

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

これで、入力するだけでうまくpqts s1ダンプされます。QString

于 2012-07-07T16:12:39.867 に答える
2

文字列の場合、p my_string.toStdString().c_str()動作します

(gdb) p my_string.toStdString().c_str()
$5 = 0x55556d10d7d0 "abc 123 test string"
于 2021-07-06T19:03:20.363 に答える
1

私はソースを読み、この次善のアプローチを思いつきました。これを改善するためにコミュニティに任せます。

    QString s1("This should be easy");

    QList<QString> 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'}
于 2012-06-30T17:26:59.433 に答える
0

私は通常p *varName.shd、文字列データを内部に持つQSharedとしてダンプするものを使用しますが、それがQListで機能するかどうかはわかりませんが、QStringでは間違いなく機能します。

于 2012-06-25T09:23:58.283 に答える
0

これは古い質問ですが、文字列用のこの関数をユーティリティに追加するだけです。

char* q(const QString& string)
{
    return(string.toUtf8().data());
}

その後、p q(myString)動作します。

于 2021-05-22T11:00:36.787 に答える