티스토리 뷰




임베디드 장비등에 QT 응용을 올려서 수행시키는 경우 원격 디버깅을 활용할 수 있는 환경이라면 좋겠지만 이러한 디버깅 환경이 용이하지 않다면 프로그램 수행 과정을 디버깅 할 수 있는 유일한 도구는 코드에서 수행하는 qDebug() 메시지들을 보는 것인데 실제 런타임 환경에서 이 또한 보기 어려우므로 이런 경우 QT의 디버깅 및 경고, 오류 메시지들을 모두 파일로 로깅해서 보는 것입니다.

qDebug() << "App started!";

위의 코드처럼 코드에서 남긴 메시지들을 파일로 남기도록 설정하면 응용의 수행 과정을 간편하게 디버깅 할 수 있습니다.


void LogToFile(QtMsgType type, const QMessageLogContext &context, const QString &msg) 
{
    QFile file("/tmp/log.txt");
    if(!file.open(QIODevice::Append | QIODevice::Text)) {
        return;
    }
    QTextStream out(&file);
    
    QString curtime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
                        //context.file, context.line, context.function
    switch (type) {
    case QtDebugMsg:
        out << "[Debug]" << curtime << msg << "\n";
        break;
    case QtInfoMsg:
        out << "[Info]" << curtime << msg << "\n";
        break;
    case QtWarningMsg:
        out << "[Warning]" << curtime << msg << "\n";
        break;
    case QtCriticalMsg:
        out << "[Critical]" << curtime << msg << context.function << context.line << "\n";
        break;
    case QtFatalMsg:
        out << "[Fatal]" << curtime << msg << "\n";
        abort();
    }
    file.close();
}


위의 같은 함수를 main()이 있는 코드에 추가하고 아래와 같이 main() 시작 부분에 메시지 핸들러를 지정해 주면 QT 메시지들을 사용자 나름으로 처리할 수 있습니다. 위의 코드에서는 QT 메시지들을 파일에 로깅하고 있습니다.


qInstallMessageHandler(LogToFile);


메시지 핸들러의 파라미터로 전달되는 context 오브젝트의 context.file, context.line, context.function등을 활용하면 해당 메시지를 출력한 소스 코드의 파일명, 함수명, 코드 라인등도 확인할 수 있습니다.


리눅스등의 시스템이라면 아래의 명령으로 로깅되는 메시지를 실시간으로 확인하면서 작업을 수행할 수 있습니다.


tail -f /tmp/log.txt






댓글
댓글쓰기 폼