Qt中的Q_ASSERT如何获得通话功能

时间:2015-12-04 01:10:44

标签: c++ qt

我在很多源文件中使用ui-view.ng-enter, ui-view.ng-leave { -webkit-transition: 1000ms ease-in-out all; transition: 1000ms ease-in-out all; } ui-view.ng-enter { opacity: 0; #register, #login, #forgot-pass { -webkit-transition: 500ms ease-out all; transition: 500ms ease-out all; margin-top: -100px; } } ui-view.ng-enter-active { opacity: 1; #register, #login, #forgot-pass { margin-top: 0px; } } ui-view.ng-leave { opacity: 1; #register, #login, #forgot-pass { -webkit-transition: 500ms ease-in all; transition: 500ms ease-in all; margin-top: 0px; } } ui-view.ng-leave-active { opacity: 0; #register, #login, #forgot-pass { margin-top: 100px; } } 。当我运行程序时,它会出错:

QVector<double>

我理解错误的含义。但是它链接到ASSERT failure in QVector<T>::operator[]: "index out of range", file C:/Qt/qt-5.5.0-x64-mingw510r0-seh-rev0/qt-5.5.0-x64-mingw510r0-seh-rev0/include/QtCore/qvector.h, line 401 whick没有帮助,因为我不知道哪个源提供了该错误。如何找到哪些源文件会出现该错误?

2 个答案:

答案 0 :(得分:2)

如果您使用的是QtCreator和GCC / GDB,请尝试设置Stop when qFatal() is called选项。

设置选项的步骤:

  1. 从菜单中选择Tools -> Options
  2. 在左侧列表中选择Debugger
  3. 选择GDB Extended标签。
  4. 检查Stop when qFatal() is called
  5. 点击Ok
  6. 运行您的应用程序。当Q_ASSERT宏评估为false时,QtCreator应该停止并显示堆栈跟踪。您可以使用堆栈跟踪来确定源代码中名为QVector<T>::operator[]的文件和行。

    我创建了一个简单的程序来测试。请注意错误的索引t[200]

    #include <QCoreApplication>
    #include <QVector>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        QVector<int> t;
    
        t << 1;
        t << 2;
    
        int x = t[1];
        int y = t[200];
    
        return a.exec();
    }
    

    如果没有设置选项,我会在控制台中获得调试输出,QtCreator会显示一些汇编语言。设置选项后,我得到一个堆栈跟踪,如下图所示:

    Qt Stack Trace

    请注意,堆栈跟踪表明我的问题位于文件main中函数main.cpp的第14行。

    Qt中的

    Q_ASSERT是作为宏实现的。 Q_ASSERT使用qFatal()Q_ASSERT Q_ASSERT文档中提到了DEBUG

    因此,设置该选项将导致QtCreator在Q_ASSERT停止。

    请注意,应用程序必须以QT_NO_DEBUG模式构建。根据文档,onclick语句在设置function bounceAgain() { var el = document.getElementById("test"); el.classList.remove('bounceInUp'); el.offsetWidth = el.offsetWidth; el.classList.add('bounceInUp'); } 时不执行任何操作。

    使用QtCreator 3.5.1和Qt 5.5.1在Windows 7中测试。

答案 1 :(得分:1)

您可以使用Qt中的qInstallMsgHandler功能来帮助您了解问题所在。

如果您在提供的链接上实现示例代码,则可以在myMessageOutput函数中添加以下内容:

if(QString(msg).conains("index out of range") == true) {
    qDebug() << "Out of range"; // <- put a breakpoint here.
} 

如果应用程序遇到断点,您还可以检查堆栈跟踪,以便以与@esorton建议相同的方式查看问题发生的位置。

PS:我不知道&#34; GDB扩展&#34;选项卡和Qt Creator中的选项,所以这就是我通常做的。我的建议的好处是你可以跟踪任何类型的消息。

不确定为什么,但做@esorton建议我的QtC给出了一个程序集Disassembler (??)输出,没有任何帮助来解决问题(可能是我的设置中断了,Ubuntu gcc 4.8和Qt 5.4):< / p>

    Function: _Z11qt_assert_xPKcS0_S0_i
0x7f0c731757ea  <+0x003a>        24 08                          and    $0x8,%al
0x7f0c731757ec  <+0x003c>        00 00                          add    %al,(%rax)
0x7f0c731757ee  <+0x003e>        00 00                          add    %al,(%rax)
0x7f0c731757f0  <+0x0040>        48 c7 44 24 10 00 00 00 00     movq   $0x0,0x10(%rsp)
0x7f0c731757f9  <+0x0049>        e8 92 52 00 00                 callq  0x7f0c7317aa90 <_ZNK14QMessageLogger5fatalEPKcz>
0x7f0c731757fe                   66 90                          xchg   %ax,%ax