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) 获得一些有用的输出?
我已经尝试过使用这个.gdbinit,它添加了一些宏,比如“printq4string”,但是当打印出我需要在每个成员变量上手动运行的结构时,这些宏使用起来非常痛苦。

4

5 回答 5

2

好吧,这让我发疯了,但我明白了。

首先确保您的项目设置为使用 GCC 4.2 而不是纯 LLVM 编译,如下所示: 在此处输入图像描述

LLVM 现在被设置为 XCode 4 中的默认编译器,它不会为类内部的结构添加正确的调试信息。

现在在你的 ~/.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.shdwhich 将其作为 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 回答