2017-03-08 51 views
0

在运行我的QT5项目,我得到警告,如有没有办法找到导致警告出现在Qt中的行?

QObject::startTimer: Timers cannot be started from another thread 

等。

尽管许多答案涵盖了在给定的代码中导致这些警告或者如何纠正它们,我想知道,其中代码中的是警告生成的一个回溯。

这是因为我认为这是由于我的某些Qt功能的不正确使用导致了内部警告的产生,例如,在上述情况下,使用定时器执行的功能。知道行号将有助于调试,但不幸的是,即使在调试模式下也没有显示。

有没有办法做到这一点?

This question似乎几乎相同,但我没有观察到类似的问题发布在那里的问题 - 我没有看到任何行号。如果适用,我不知道如何在那里应用答案。

谢谢。

+0

虽然答案是一样的。基本上你使用一个自定义的消息处理程序来处理警告,并在那里放置一个断点。 – nwp

+1

可能重复[如何重定向qDebug,qWarning,qCritical等输出?](http://stackoverflow.com/questions/4954140/how-to-redirect-qdebug-qwarning-qcritical-etc-output) – nwp

+0

@nwp谢谢你非常喜欢这个链接。但是,我的警告消息无法正常工作。我已经用结果编辑了我的问题。 – GoodDeeds

回答

0

nwp,在评论时指出this answer通过Nawaz,当我把一个破发点上的警告消息行,在这里伟大的工程:

case QtWarningMsg: 
     fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); //break point here 
     break; 

这给出了一个合适的追踪在调试器中运行时模式,因为我需要。

1

最好的方法是设置一个断点,如其他人提到的那样。

在Linux上,还可以包括消息模式回溯:

qSetMessagePattern("%{file}:%{line} - %{message}\n%{backtrace depth=10 separator=\"\n\"}"); 

看一看its documentation,尤其是对于限制。 输出示例:

/home/thomas/src/Qt/5.8-desktop/qtbase/src/corelib/kernel/qobject.cpp:1639 - QObject::startTimer: Timers can only be used with threads started with QThread 
QObject::startTimer 
QTimer::start 
?myapp? 
__libc_start_main 
?myapp? 

因为我不与-rdynamic联,所述main()功能没有在回溯已知的,并且?myapp?打印代替。

相关问题