在Qt Creator中打破CDB的断言

时间:2016-07-13 18:56:47

标签: c++ qt debugging qt-creator windbg

我偶尔会在QVector::operator[]中得到一个断言。我无法打破这个断言。

我已经在this回答中尝试了所有建议,但他们要么不工作,要么不是我之后的事情:

  

您可以为Qt发出的消息/警告安装处理程序,并自行处理它们。

我宁愿不必每次都这样做。

  

在qt Creator中转到工具 - >选项 - >调试器 - > GDB并选择"在发布qFatal时停止"

此选项对于CDB不存在。

  

我手动编写了一个BreakInDebugger函数和一个调用该函数的断言宏。

我不想触摸Qt代码。此外,我还可以编辑qvector.h并添加一条我可以实际打破的行:

if (i >= 0 && i < d->size)
    qDebug() << "oops";

仅使用Creator可以吗?

更新:它似乎与断言的触发位置有关。这样的例子有效:

#include <QGuiApplication>
#include <QtQuick>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QVector<int> i;
    i[0] = 0;

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

也就是说,我得到了典型的错误对话框,其中包含调试断言的选项:

---------------------------
Microsoft Visual C++ Runtime Library
---------------------------
Debug Error!

Program: C:\dev\qt5-dev-debug\qtbase\lib\Qt5Cored.dll
Module: 5.8.0
File: C:\dev\qt5-dev\qtbase\src\corelib\global\qglobal.cpp
Line: 3045

ASSERT failure in QVector<T>::operator[]: "index out of range", file c:\dev\qt5-dev-debug\qtbase\include\qtcore\../../../../qt5-dev/qtbase/src/corelib/tools/qvector.h, line 433

(Press Retry to debug the application)

---------------------------
Abort   Retry   Ignore   
---------------------------

然而,对于单元测试项目,我没有得到任何对话:

#include <QString>
#include <QtTest>

class Untitled3Test : public QObject
{
    Q_OBJECT

public:
    Untitled3Test();

private Q_SLOTS:
    void testCase1();
};

Untitled3Test::Untitled3Test()
{
}

void Untitled3Test::testCase1()
{
    QVector<int> i;
    i[0] = 0;
}

QTEST_APPLESS_MAIN(Untitled3Test)

#include "tst_untitled3test.moc"

1 个答案:

答案 0 :(得分:1)

正如在bug report中发现的那样,这是由于use的testlib crash handler导致了通常在断言时出现的错误对话框。将以下应用程序参数传递给自动测试可以解决问题:

-nocrashhandler

This更改改进了此功能的文档。