Russian Qt Forum

Qt => Кладовая готовых решений => Тема начата: gil9red от Июль 09, 2014, 18:45



Название: Отладочные сообщения
Отправлено: gil9red от Июль 09, 2014, 18:45
Простая обертка, которая позволяет выводить определенные сообщения с указанием файла, функции и строки, где она использовалась :)

Код
C++ (Qt)
#include <QDebug>
 
#define OUT_MESSAGE "\"%s\": in file \"%s\", func \"%s\", line %i"
#define WARNING( msg )  qWarning( OUT_MESSAGE,  qPrintable( msg ), __FILE__, __FUNCTION__, __LINE__ );
#define CRITICAL( msg ) qCritical( OUT_MESSAGE, qPrintable( msg ), __FILE__, __FUNCTION__, __LINE__ );
#define FATAL( msg )    qFatal( OUT_MESSAGE,    qPrintable( msg ), __FILE__, __FUNCTION__, __LINE__ );
 

Пример:
Код
C++ (Qt)
void FileListModel::itemChanged() {
   FileItem * item = qobject_cast<FileItem *> (sender());
   if (!item) {
       WARNING("null pointer!");
       return;
   }
...
 

Консоль:

"null pointer!": in file "..\ListFiles\filelistmodel.cpp", func "itemChanged", line 47


Название: Re: Отладочные сообщения
Отправлено: kuzulis от Июль 09, 2014, 21:15
Вообще, в Qt5 есть QLoggingCategory с помощью которого можно много чего навыводить.


Название: Re: Отладочные сообщения
Отправлено: Bepec от Июль 09, 2014, 21:40
Тут дело в сокращении вызова. Warning() проще чем qCDebug(MyCategory) << "bla bla".


Название: Re: Отладочные сообщения
Отправлено: kuzulis от Июль 09, 2014, 22:03
Эмм.. Но ты можешь переопределить Message Handler (или как там его) и выводить аналогичное с помощью qCDebug(Warning/Critical)():

Код
C++ (Qt)
qCDebug(category) << "null pointer!";
qCDebug(category, "null pointer!");
qCDebug(category) << "my pointer:" << mypointer;
qCDebug(category, "my pointer: %p", mypointer);
 

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



Название: Re: Отладочные сообщения
Отправлено: navrocky от Июль 09, 2014, 22:18
на самом деле никто не мешает все запихнуть в макрос:

Код:
#define MY_WARN qWarning() << __FILE__ << __FUNCTION__

MY_WARN << "lolo" << 1 << 2 << 3;


Название: Re: Отладочные сообщения
Отправлено: gil9red от Июль 09, 2014, 23:33
Интересные и хорошие варианты были предложены :)


Название: Re: Отладочные сообщения
Отправлено: Bepec от Июль 10, 2014, 00:03
Эх был бы вывод дебажный в строчку, чтоб вывел все локальные и глобальные переменные и их значения + строчку + файл и всё это автоматом :D

PS кто знает, мб есть какая нить утварь с таким функционалом? :)


Название: Re: Отладочные сообщения
Отправлено: navrocky от Июль 10, 2014, 07:59
Эх был бы вывод дебажный в строчку, чтоб вывел все локальные и глобальные переменные и их значения + строчку + файл и всё это автоматом :D

PS кто знает, мб есть какая нить утварь с таким функционалом? :)

Локальные переменные невозможно перечислить в C++. А вот стеки можно получать, надо копать в сторону google breakpad, там есть трассировщик стека и символизатор.

Стек намного полезнее, чем строка в файле.



Название: Re: Отладочные сообщения
Отправлено: Bepec от Июль 10, 2014, 09:13
Ну... Получить можно и перечислить тоже :) я же говорю не о возможностях С++, а об утилитке аля moc. Кстати мысль... А почему же тогда никто этого не сделал? :P

Ну всмысле перед компиляцией пробегаемся и анализируем код, потом на место метки-вызова ставим код вызова. Ммм...