◀ANSI版開発トップへ
  • 2621 デバッグの工夫
  • [2621] デバッグの工夫 kh 2003年03月15日 00:42

    はじめまして、ソースファイルを読ませてもらって
    いろいろ参考にさせてもらってます。

    デバッグ(VC6で)するときのちょっとした工夫を
    書きますので簡単ですので試してみてください。

    Debug.h において---------------

    #ifdef _DEBUG
    #define MYTRACE DebugOut

    // 以下の4行をここに追加
    #define INDNT_N 4
    #define MYTRACE_INDNT_BGN(X) DebugOut("==> " #X " \n"), dbgIndnt += INDNT_N
    #define MYTRACE_INDNT_END(X) dbgIndnt -= INDNT_N, DebugOut("<== " #X " \n")
    extern int dbgIndnt;//@@@@@@

    #endif
    ----------------------------------

    Debug.cpp において-----------

    これを追加
    int dbgIndnt = 0;

    この関数を入れ替え
    void DebugOut( LPCTSTR lpFmt, ...)
    {
    static TCHAR szText0[16000];
    strcpy(szText0,"");
    for ( int i = 0; i < dbgIndnt; i ++ ) strcat(szText0," ");
    strcat(szText0,lpFmt);

    static TCHAR szText[16000];
    va_list argList;
    va_start(argList, lpFmt);
    ::wvsprintf( szText, szText0, argList );
    ::OutputDebugString( szText );

    ::Sleep(1); // Norio Nakatani, 2001/06/23 大量にトレースするときのために

    va_end(argList);
    return;
    }
    --------------------------------

    これだけで以下のようにソースファイルに記述するだけで

    --------------------------------
    void CEditView::func_A()
    {
    MYTRACE_INDNT_BGN(func_A);
    int x = 11, y = 22;
    MYTRACE( "x=%d y=%d\n", x, y );

    func_B();

    MYTRACE_INDNT_END(func_A);
    }
    void CEditView::func_B()
    {
    MYTRACE_INDNT_BGN(func_B);
    int x = 33, y = 44;
    MYTRACE( "x=%d y=%d\n", x, y );

    MYTRACE_INDNT_END(func_B);
    }

    LRESULT CEditView::OnMOUSEWHEEL( WPARAM wParam, LPARAM lParam )
    {
    MYTRACE_INDNT_BGN(マウスホイールのメッセージ処理);

    func_A();
    ・・・・・・・・・・・・・・・・・・
    ・・・・・・・・・・・・・・・・・・

    MYTRACE( "xPos=%d yPos=%d\n", xPos, yPos );

    MYTRACE_INDNT_END(マウスホイールのメッセージ処理);
    return 0;
    }
    --------------------------

    以下のようにデバッグウィンドウにインデントされて表示されます。

    --------------------------

    ==> マウスホイールのメッセージ処理
    ==> func_A
    x=11 y=22
    ==> func_B
    x=33 y=44
    <== func_B
    <== func_A
    xPos=5989260 yPos=0
    <== マウスホイールのメッセージ処理

    --------------------------

    これだけでだいぶ読みやすくなると思います。