C++ Qt中的Q_断言。如何获取调用函数
我在很多源文件中使用了C++ Qt中的Q_断言。如何获取调用函数,c++,qt,C++,Qt,我在很多源文件中使用了QVector。当我运行程序时,它会给出一个错误: QVector::operator[]:“索引超出范围”,文件C:/Qt/Qt-5.5.0-x64-mingw510r0-seh-rev0/Qt-5.5.0-x64-mingw510r0-seh-rev0/include/QtCore/QVector.h,第401行 我理解那个错误的意思。然而,它链接到qvector.h而这并没有什么帮助,因为我不知道是哪个源给出了这个错误。我如何才能找到哪个源文件出现了该错误?如果您使用
QVector
。当我运行程序时,它会给出一个错误:
QVector::operator[]:“索引超出范围”,文件C:/Qt/Qt-5.5.0-x64-mingw510r0-seh-rev0/Qt-5.5.0-x64-mingw510r0-seh-rev0/include/QtCore/QVector.h,第401行
我理解那个错误的意思。然而,它链接到
qvector.h
而这并没有什么帮助,因为我不知道是哪个源给出了这个错误。我如何才能找到哪个源文件出现了该错误?如果您使用的是QtCreator和GCC/GDB,请尝试在调用qFatal()时设置停止选项
设置选项的步骤:
从菜单中选择Tools->Options
在左侧列表中选择Debugger
选择GDB Extended
选项卡
选中调用qFatal()时停止
单击Ok
运行应用程序。当Q_ASSERT宏的计算结果为false时,QtCreator应该停止并显示堆栈跟踪。您可以使用堆栈跟踪来确定源代码中名为QVector::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();
}
#包括
#包括
int main(int argc,char*argv[])
{
qcorea应用程序(argc、argv);
qt向量;
t如果您使用的是QtCreator和GCC/GDB,请尝试设置调用qFatal()时停止的选项
设置选项的步骤:
从菜单中选择Tools->Options
在左侧列表中选择Debugger
选择GDB Extended
选项卡
选中调用qFatal()时停止
单击Ok
运行应用程序。当Q_ASSERT宏的计算结果为false时,QtCreator应停止并显示堆栈跟踪。您可以使用堆栈跟踪确定源代码中调用QVector::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();
}
#包括
#包括
int main(int argc,char*argv[])
{
qcorea应用程序(argc、argv);
qt向量;
t您可以使用Qt中的函数来了解问题发生的位置
如果在提供的链接上实现示例代码,则可以在myMessageOutput
函数中添加如下内容:
if(QString(msg).conains("index out of range") == true) {
qDebug() << "Out of range"; // <- put a breakpoint here.
}
您可以使用Qt中的函数来了解问题发生的位置
如果在提供的链接上实现示例代码,则可以在myMessageOutput
函数中添加如下内容:
if(QString(msg).conains("index out of range") == true) {
qDebug() << "Out of range"; // <- put a breakpoint here.
}
通过QtCreator在调试模式下运行应用程序。应用程序运行时,您将能够看到调用堆栈crashes@Lahiru这个错误发生在调试模式下。在发布模式下没有检查[]
运算符。但是在调试模式下没有堆栈调用信息,Q\u ASSERT
会以某种方式抑制它。在我的QtCreator中,当应用程序因Q\u ASSERT
而崩溃时,我会看到一个对话框,可以选择中止、重试或取消。如果我按下重试,QtCreator会显示堆栈跟踪,就像程序遇到断点一样。我在Windows和QtCrea上Tor使用Visual C++编译器。platforms@LahiruChandima通常在我的QtCreator中也会发生同样的情况,但在这种情况下就不会了。如果没有其他方法有效,您可以在每次使用QVector的[]之前搜索源代码并放置断点操作员。通过QtCreator在调试模式下运行应用程序。应用程序运行时,您将能够看到调用堆栈crashes@Lahiru这个错误发生在调试模式下。在发布模式下没有检查[]
运算符。但是在调试模式下没有堆栈调用信息,Q\u ASSERT
会以某种方式抑制它。在我的QtCreator中,当应用程序因Q\u ASSERT
而崩溃时,我会看到一个对话框,可以选择中止、重试或取消。如果我按下重试,QtCreator会显示堆栈跟踪,就像程序遇到断点一样。我在Windows和QtCrea上Tor使用Visual C++编译器。platforms@LahiruChandima通常在我的QtCreator中也会发生同样的情况,但在这种情况下就不会了。如果没有其他方法有效,您可以在每次使用QVector的[]之前搜索源代码并放置断点接线员。+1的信息,但我似乎无法让这个工作,看到我的答案…如果它是一个非常好的和简单的方式来解决问题,我没有意识到+1的信息,但我似乎无法让这个工作,看到我的答案…如果它工作,这是一个非常好的和简单的方式来解决问题,我没有意识到