Qt错误打印在控制台上;如何知道它的起源?

Qt错误打印在控制台上;如何知道它的起源?,qt,error-handling,qml,qtquick2,Qt,Error Handling,Qml,Qtquick2,我在QML应用程序的控制台上得到了这个: QFont::setPointSizeF: Point size <= 0 (0.000000), must be greater than 0 应用程序没有崩溃,因此我无法使用调试器获取异常的回溯跟踪。如何查看错误的来源?我认为您可以使用Qt5或Qt4指定一个回调,该回调将拦截所有qDebug/qInfo/etc消息。链接中有示例代码。然后,您可以在这个回调函数中添加一个断点,并获得一个好的调用堆栈。我认为您可以使用Qt5或Qt4指定一个回调,

我在QML应用程序的控制台上得到了这个:

QFont::setPointSizeF: Point size <= 0 (0.000000), must be greater than 0

应用程序没有崩溃,因此我无法使用调试器获取异常的回溯跟踪。如何查看错误的来源?

我认为您可以使用Qt5或Qt4指定一个回调,该回调将拦截所有qDebug/qInfo/etc消息。链接中有示例代码。然后,您可以在这个回调函数中添加一个断点,并获得一个好的调用堆栈。

我认为您可以使用Qt5或Qt4指定一个回调,该回调将拦截所有qDebug/qInfo/etc消息。链接中有示例代码。然后,您可以在这个回调函数中添加一个断点,并获得一个好的调用堆栈。

如果您知道在这种情况下出现警告的函数,您可以在那里放置一个断点。跟踪堆栈跟踪将引导您找到调用该函数的代码

如果警告没有包含函数的名称,并且您有可用的源代码,请使用git grep和部分警告来了解它的来源。这种方法可能需要反复尝试,因为代码可能跨越多行,等等,因此您可能需要尝试字符串的不同部分

如果警告未包括函数名称,您没有可用的源代码和/或您不喜欢前面的方法,请使用环境变量:

QT_MESSAGE_PATTERN="%{function}: %{message}"
有关可供您使用的变量的完整列表,请参阅:

%{appname}-QCoreApplication::applicationName %{category}-日志记录类别 %{file}-源文件的路径 %{function}-函数 %{line}-源文件中的第行 %{message}-实际消息 %{pid}-QCoreApplication::applicationPid %{threadid}-当前线程的系统范围ID(如果可以获得) %{qthreadptr}-指向QThread::currentThread的当前QThread结果的指针 %{type}-调试、警告、严重或致命 %{time process}-消息的时间,以秒为单位,自进程启动后,令牌进程为文本 %{time boot}-消息的时间,以系统启动后的秒为单位,如果可以确定,则令牌启动为文本启动。如果无法获得自启动以来的时间,则输出是不确定的。请参阅QElapsedTimer::msecsSinceReference。 %{time[format]}-消息发生时的系统时间,通过将格式传递给QDateTime::toString进行格式化。如果未指定格式,则使用Qt::ISODate格式。 %{backtrace[depth=N][separator=…]}-由可选深度参数指定的帧数的回溯跟踪默认为5,由可选分隔符参数分隔的回溯跟踪默认为|。此扩展仅在某些平台上可用,目前仅在使用glibc的平台上可用。只有导出的函数才知道名称。如果要查看应用程序中每个函数的名称,请使用QMAKE_LFLAGS+=-rdynamic。在读取回溯时,考虑到帧可能由于内联或尾部调用优化而丢失。
值得注意的是,%{time[format]}占位符非常有用,可以通过在它之前和之后进行qDebuging来快速分析代码。

如果您知道在这种情况下出现警告的函数,可以在那里设置断点。跟踪堆栈跟踪将引导您找到调用该函数的代码

如果警告没有包含函数的名称,并且您有可用的源代码,请使用git grep和部分警告来了解它的来源。这种方法可能需要反复尝试,因为代码可能跨越多行,等等,因此您可能需要尝试字符串的不同部分

如果警告未包括函数名称,您没有可用的源代码和/或您不喜欢前面的方法,请使用环境变量:

QT_MESSAGE_PATTERN="%{function}: %{message}"
有关可供您使用的变量的完整列表,请参阅:

%{appname}-QCoreApplication::applicationName %{category}-日志记录类别 %{file}-源文件的路径 %{function}-函数 %{line}-源文件中的第行 %{message}-实际消息 %{pid}-QCoreApplication::applicationPid %{threadid}-当前线程的系统范围ID(如果可以获得) %{qthreadptr}-指向QThread::currentThread的当前QThread结果的指针 %{type}-调试、警告、严重或致命 %{time process}-消息的时间,以秒为单位,自进程启动后,令牌进程为文本 %{time boot}-消息的时间,以系统启动后的秒为单位,如果可以确定,则令牌启动为文本启动。如果无法获得自启动以来的时间,则输出是不确定的。请参阅QElapsedTimer::msecsSinceReference。 %{time[format]}-消息发生时的系统时间,通过将格式传递给QDateTime::toString进行格式化。如果未指定格式,则使用Qt::ISODate格式。 %{backtrace[depth=N][separator=…]}-具有可选深度p指定的帧数的回溯跟踪 参数默认为5,由可选分隔符分隔的参数默认为|。此扩展仅在某些平台上可用,目前仅在使用glibc的平台上可用。只有导出的函数才知道名称。如果要查看应用程序中每个函数的名称,请使用QMAKE_LFLAGS+=-rdynamic。在读取回溯时,考虑到帧可能由于内联或尾部调用优化而丢失。
值得一提的是,%{time[format]}占位符非常有用,它可以通过前后的qDebuging快速分析代码。

除了搜索代码中对setPointSize[F]的调用这一显而易见的问题外,您还可以根据您未公开的环境尝试以下操作:


如果您安装了Qt库的调试符号,并且正在使用一个合适的调试器,那么您可以在QFont::setPointSizeF中的第一行设置一个条件断点,条件设置为pointSize,除了显而易见的之外,还可以在代码中搜索对setPointSize[F]的调用,根据您未披露的环境,您可以尝试以下操作:


如果您安装了Qt库的调试符号,并且正在使用一个合适的调试器,那么您可以在QFont::setPointSizeF的第一行设置一个条件断点,条件设置为pointSize,这会阻止您搜索setPointSizeF?@Murphy:first off,有可能,而且可能是,我的代码不直接调用StPositStEng+C++函数,它主要是QML,但由于我将其分配给QML中对象的属性点大小。然后我可以在项目中搜索pointSize,这就是我第一次做的。但是我得到了太多的匹配,这是一个更大的项目,所以我想要一个更精确的方法。好的,如果你找不到一个代码生成错误,你是怎么造成这个问题的?警告是很清楚的。是什么阻止你搜索StPositsiZEF?@墨菲:首先,它是可能的,并且可能是,StPositStEngs+C++函数不是直接由我的代码直接调用的,它主要是QML,但由于我将其分配给QML中对象的属性点大小。然后我可以在项目中搜索pointSize,这就是我第一次做的。但是我得到了太多的匹配,这是一个更大的项目,所以我想要一个更精确的方法。好的,如果你找不到一个代码生成错误,你是怎么造成这个问题的?警告很清楚。