有没有办法找到导致在 Qt 中出现警告的行?
Is there a way to find the line that caused a warning to appear in Qt?
当 运行 我的 Qt5 项目时,我收到诸如
之类的警告
QObject::startTimer: Timers cannot be started from another thread
和其他人。
虽然许多答案都涵盖了给定代码中是什么导致了这些警告,或者如何纠正它们,但我想知道 代码中 哪里产生了警告,追溯.
这是因为我认为这是由于我错误地使用了一些 Qt 功能导致的,这些功能会在内部引起警告,例如,在上述情况下,使用计时器执行的功能。知道行号对调试很有帮助,但不幸的是即使在调试模式下也不会显示。
有办法吗?
This question 似乎几乎相同,但我没有观察到与问题中发布的内容类似的任何内容 - 我没有看到任何行号。我不明白如何在那里应用答案(如果适用)。
谢谢。
nwp, in the comments, pointed out this answer by Nawaz,当我在警告消息行上放置一个断点时效果很好,这里:
case QtWarningMsg:
fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); //break point here
break;
当 运行 在调试器模式下时,这会根据我的需要提供适当的回溯。
最好的方法就是像其他人提到的那样设置断点。
在 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?
。
当 运行 我的 Qt5 项目时,我收到诸如
之类的警告QObject::startTimer: Timers cannot be started from another thread
和其他人。
虽然许多答案都涵盖了给定代码中是什么导致了这些警告,或者如何纠正它们,但我想知道 代码中 哪里产生了警告,追溯.
这是因为我认为这是由于我错误地使用了一些 Qt 功能导致的,这些功能会在内部引起警告,例如,在上述情况下,使用计时器执行的功能。知道行号对调试很有帮助,但不幸的是即使在调试模式下也不会显示。
有办法吗?
This question 似乎几乎相同,但我没有观察到与问题中发布的内容类似的任何内容 - 我没有看到任何行号。我不明白如何在那里应用答案(如果适用)。
谢谢。
nwp, in the comments, pointed out this answer by Nawaz,当我在警告消息行上放置一个断点时效果很好,这里:
case QtWarningMsg:
fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); //break point here
break;
当 运行 在调试器模式下时,这会根据我的需要提供适当的回溯。
最好的方法就是像其他人提到的那样设置断点。
在 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?
。