Можно ли связать __FILE__ и __LINE__ при печати в консоль отладки Qt Creator?

#debugging #qt #gdb #qt-creator #c-preprocessor

#отладка #qt #gdb #qt-creator #c-препроцессор

Вопрос:

Заголовок:

 #define TRACE_ERROR(s)                      
{
  ...
  char TraceBuffer[512];
  sprintf(TraceBuffer, "%st(%s:%d)", s, __FILE__, __LINE__);
  DebugErrTrace(TraceBuffer);
  ...
}
  

Реализация:

 void DebugErrTrace(char *String, ...) {
  ...
  qDebug() << String;
}
  

Приведенное выше выдает строку трассировки отладки, которая может выглядеть примерно так

ERROR File Missing! (..trunkCommonFileManager.cpp:102)

в консоли отладки Qt Creator.

Я заметил, что собственные сообщения об ошибках Qt, например

Object::connect: No such slot cClass::Method(QString) in ..trunkComponentsClass.cpp:301

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

Приветствия, Сэм

Комментарии:

1. Вы пробовали превращать табуляцию в пробел или удалять круглые скобки вокруг пары файл / строка в выходных данных? Может быть, Qt Creator использует какой-то другой метод вывода своих сообщений?

2. @JoachimPileborg: Я не думал пробовать это, но это не сработало. В любом случае спасибо!

3. Переход к QObject::connect() показывает, что сообщение отладки Qt генерируется с помощью qWarning (см. QObject:err_method_notfound() в Qt.4.7.4). Однако использование подобного qWarning("Test in %s:%i", __FILE__, __LINE__ ); также не дает мне связанного сообщения.

Ответ №1:

Согласно исходному коду Qt Creator (там), гиперссылки создаются только для строк, соответствующих этим регулярным выражениям:

 "^(?:\[Qt Message\] )?(file:///. :\d (?::\d )?):"
"Object::.*in (.*:\d )"
"ASSERT: .* in file (. , line \d )"
"^   Loc: \[(.*)\]"
  

Итак, простейшие строки, которые вы могли бы построить, выглядят так:

 qWarning("file:///%s:%i: %s", __FILE__, __LINE__, "your message");
qWarning("   Loc: [%s:%i] %s", __FILE__, __LINE__, "your message");
  

Qt Creator, похоже, не волнует, является ли путь после "file:///" абсолютным или нет.

Ответ №2:

В дополнение к ответу alexisdm (который мне очень помог, большое спасибо!):

Вместо определения пользовательского макроса я бы предложил выполнить следующее в более новых версиях Qt и использовать qDebug сам:

 qSetMessagePattern("%{if-category}%{category}: %{endif}%{message}n   Loc: [%{file}:%{line}]");
  

Предыдущая часть n является шаблоном сообщений Qt по умолчанию, и разделение на n имеет то преимущество, что сообщения журнала также могут содержать символы типа [ или ] без искажения ссылок.

Шаблон сообщения можно легко расширить с помощью других сведений журнала, таких как временные метки, идентификатор потока и так далее, см. Документацию. При добавлении других сведений сохраняйте ссылку в отдельной строке, чтобы избежать проблем с синтаксическим анализом Qt Creator.