1

最終的にprintf呼び出しになるいくつかの可変マクロと関数を使用して、プロジェクトのログシステムを作成しようとしています。ただし、printf でアクセス違反エラーが発生し、その理由がわかりません。

それでは、私のマクロから始めましょう。

#ifdef _DEBUG
#define LogError(fmt, ...) Logger::Log(LOG_ERROR,fmt,__VA_ARGS__);
#define LogTrace(fmt, ...) Logger::Log(LOG_TRACE,fmt,__VA_ARGS__);
#define LogWarn(fmt, ...) Logger::Log(LOG_WARN,fmt,__VA_ARGS__);
#else
#define LogError(fmt, ...)   
#define LogTrace(fmt, ...)   
#define LogWarn(fmt, ...)  
#endif

ご覧のとおり、_DEBUG が定義されている場合、マクロは Logger::Log の呼び出しに解決され、すべての引数が渡されます。

これが私の Logger::Log 関数です:

void Logger::Log(LogType type, char* fmt, ...) {
     va_list args;
    va_start (args, fmt);
    std::string preFix = "";
    if (type==LOG_ERROR) preFix = "Error: ";
    else if (type==LOG_WARN) preFix = "Warn: ";
    else if (type==LOG_TRACE) preFix = "Trace: ";
    else preFix = "Unknown: ";

    printf(preFix.append(fmt).c_str(), args);
    va_end(args);
}

ログのタイプに基づいた文字列をフォーマット文字列の前に付けてから、可変数の引数を printf に渡すと、アクセス違反が発生します。

これは、プログラムをクラッシュさせているマクロを使用している実装です。

LogTrace("Adding file to asset file. Asset name: %s, File: %s", fName.c_str(), assetName.c_str());

マクロによると、これは次のように解決されます。

Logger:Log(LOG_WARN,"Adding file to asset file. Asset name: %s, File: %s", <string1>, <string2>);

関数の printf に渡す必要がありLogます。ブレークポイントを使用すると、フォーマット文字列が適切に渡され、プレフィックスが付けられていることがわかりますが、可変数の引数が関数に適切に渡されていることを確認するためにデバッグできないようですLog

可変量の引数をマクロ、関数、および printf に渡すためにすべてを正しく行ったでしょうか? すべてを正しく行ったように見える場合、変数の引数がどのように渡されているかを確認するためにデバッグするにはどうすればよいですか? どんな助けでも大歓迎です。

4

1 に答える 1

2

質問を投稿した直後に問題が見つかりました... 可変量の引数を正しく機能させるには、printf を vprintf にする必要があります。

于 2013-06-03T23:45:12.157 に答える