Есть ли способ найти строку, которая вызвала предупреждение в Qt?

Во время работы над моим проектом Qt5 я получаю такие предупреждения, как

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

и другие.

Хотя многие ответы охватывают то, что в данном коде вызвало эти предупреждения, или как их исправить, я хотел бы знать, где в коде было сгенерировано предупреждение, traceback.

Это потому, что я думаю, что это вызвано моим неправильным использованием некоторых функций Qt, которые вызывают внутренние предупреждения, такие как, в вышеупомянутом случае, функции, которые используют таймеры для выполнения. Знание номера строки было бы полезно для отладки, но, к сожалению, это не отображается, даже в режиме отладки.

Есть ли способ сделать это?

Этот вопрос кажется почти идентичным, но я не наблюдаю ничего похожего на то, что написано в вопросе — я не вижу номеров строк. Я не понял, как применить ответ там, если применимо.

Спасибо.

0

Решение

Лучший способ — установить точку останова, как уже упоминалось.

В 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? вместо этого печатается.

1

Другие решения

выраженный в числах, в комментариях указал этот ответ от Наваз, это прекрасно работает, когда я ставлю точку останова в строке предупреждающего сообщения, здесь:

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

Это дает правильную трассировку при работе в режиме отладчика, как мне было нужно.

0

По вопросам рекламы [email protected]