Во время работы над моим проектом Qt5 я получаю такие предупреждения, как
QObject::startTimer: Timers cannot be started from another thread
и другие.
Хотя многие ответы охватывают то, что в данном коде вызвало эти предупреждения, или как их исправить, я хотел бы знать, где в коде было сгенерировано предупреждение, traceback.
Это потому, что я думаю, что это вызвано моим неправильным использованием некоторых функций Qt, которые вызывают внутренние предупреждения, такие как, в вышеупомянутом случае, функции, которые используют таймеры для выполнения. Знание номера строки было бы полезно для отладки, но, к сожалению, это не отображается, даже в режиме отладки.
Есть ли способ сделать это?
Этот вопрос кажется почти идентичным, но я не наблюдаю ничего похожего на то, что написано в вопросе — я не вижу номеров строк. Я не понял, как применить ответ там, если применимо.
Спасибо.
Лучший способ — установить точку останова, как уже упоминалось.
В Linux также возможно включить обратную трассировку в шаблон сообщения:
qSetMessagePattern("%{file}:%{line} - %{message}\n%{backtrace depth=10 separator=\"\n\"}");
Посмотри на его документация, особенно для ограничений.
Пример вывода:
/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?
вместо этого печатается.
выраженный в числах, в комментариях указал этот ответ от Наваз, это прекрасно работает, когда я ставлю точку останова в строке предупреждающего сообщения, здесь:
case QtWarningMsg:
fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); //break point here
break;
Это дает правильную трассировку при работе в режиме отладчика, как мне было нужно.