有没有办法找到导致在 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?

因为我没有链接 -rdynamicmain() 函数在回溯中是未知的,而是打印了 ?myapp?