我偶尔会在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"
答案 0 :(得分:1)
正如在bug report中发现的那样,这是由于use的testlib crash handler导致了通常在断言时出现的错误对话框。将以下应用程序参数传递给自动测试可以解决问题:
-nocrashhandler
This更改改进了此功能的文档。