Turn On Blog

ぺーぺーSEの色々メモ

【Qt】QMessageLogContextをreleaseモードでも利用する

やりたいこと

qSetMessagePatternでラクに関数名を出力したい。

以下をはじめに一発叩いておくと、

qSetMessagePattern("%{file} %{line} %{function} : %{message}");

その後はqDebug()やqWarning()にいつもどおりこうするだけで、

// test.cpp
void test()
{
    qDebug() << "sample message";
}

ログをこんなふうに出してくれます。

test.cpp 4 test() : "sample message"

こりゃ使わない手はない!
qDebug() << Q_FUNC_INFO << ... ともおさらばだ!

困ったこと

debugビルドでは思い通りに動いてくれてたけど、
releaseビルドにかえてみるとどうもおかしい。

%{function} とか%{line}とか使ったら出るはずの関数名や行数が出ない。
関数名にあたるとこはunknown, 行数にあたるところは0になってしまう。

さっきの例でいうと、こんなかんじになっちゃいます

// test.cpp 4 test() : "sample message"
unknown 0 unknown : "sample message"

つらい。

解決方法

これらfunctionだとかlineだとかは、QMessageLogContextというクラスに記録される情報です。
そしてこのQMessageLogContextの内容は、基本的にはdebugモードでしか記録されません。

ですが、QMessageLogContext Class | Qt Core 5.4に書いてあるとおり、
QT_MESSAGELOGCONTEXT を定義してビルドしてやることで、
releaseモードでもQMessageLogContextが記録されるようになります。

というわけで、.proファイルに以下を追記しておきました。

// xxx.pro
DEFINES += QT_MESSAGELOGCONTEXT