#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.