みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

関数の入り口出口でデバッグログ

関数の入り口と出口でログ出力したいが、 1関数につき必ず2行以上ログのコードを入れる必要がある。 また、途中で抜けた場合など、ケアが難しいケースがある。

boost::scope_exit

boost::scope_exitを利用する。

#include <boost/scope_exit.hpp>

#define FUNC_IN_OUT_LOG                                     \
std::cout << "begin :" << __PRETTY_FUNCTION__ << std::endl; \
std::string func = __PRETTY_FUNCTION__;                     \
BOOST_SCOPE_EXIT((func)) {                                  \
    std::cout << "end   :" << func << std::endl;            \
} BOOST_SCOPE_EXIT_END

BOOST_SCOPE_EXITマクロは変数キャプチャ機能がある。 BOOST_SCOPE_EXITで定義したスコープ内で __PRETTY_FUNCTIN__を利用すると、自動生成された構造体の シンボルがくっついてしまうため、 スコープ外で__PRETTY_FUNCTION__して変数に入れておき、 キャプチャしたものをログ出力するというところがポイントとなる。

使用例

void Foo::foo() {
     FUNC_IN_OUT_LOG
     ...
}

result

begin : void Foo::foo()
end   : void Foo::foo()

難点は例外をthrowした場合でも、スコープアウトとみなして endの出力がされてしまうところか。。。