デバッグ方法とテクニック(zz)


デバッグしやすいコードスタイル:
  • は、グローバル変数
  • を用いない.
  • すべての変数を初期化し、構成関数においてメンバ変数を初期化する
  • .
  • はできるだけconst
  • を使います.
  • 詳細な注釈
  • VC+コンパイルのオプション:
  • はいつも/W 4警告レベル
  • を使用します.
  • デバッグバージョンでは常に/GZコンパイルオプションを使用して、Releaseバージョンでしかないエラーを発見するために使用されます.
  • 警告なしのコンパイル:コンパイル後には警告がないことを保証しますが、警告をなくす前に慎重にチェックします.
    デバッグ方法:
    1、アスリートを使う(原則:できるだけ簡単にする)
    astertはdebugでのみ有効です.releaseではコンパイルされません.
    例:
    char* strcpy(char* dest,char* source)
    {
    	assert(source!=0);
    	assert(dest!=0);
    	char* returnstring = dest;
    	
    	while((*dest++ = *source++)!= ‘\0’)
    	{
    		;
    	}
    	return returnstring;
    }      
    2、防御的なプログラミング
    例:
    char* strcpy(char* dest,char* source)
    {
    	if(source == 0)
    	{
    		assert(false);
    		reutrn 0;
    	}
    	if(dest == 0)
    	{
    		assert(false);
    		return 0;
    	}
    	char* returnstring = dest;
    	while((*dest++ = *source++)!= ‘\0’)
    	{
    		;
    	}
    	return returnstring;
    }      
    3、Traceを使用する
    以下の例はdebugにしか表示されません.
    例:
    a)、TRACE
    CString csTest = “test”;
    TRACE(“CString is %s
    ”,csTest);
    b)、ATLTACE
    c)、afxDump
    CTime time = CTime::GetCurrentTime();
    #ifdef _DEBUG
    afxDump << time << “
    ”; #endif
    4、GetLastErrerで戻り値を検出し、エラーコードを得ることでエラーの原因を分析する
    5、エラー情報をファイルに記録する
    異常処理
    プログラム設計時には異常を考慮してどのように処理しますか?エラーが発生したら、簡単にエラーを報告してプログラムを終了してはいけません.できるだけエラーの前の状態に回復したり、プログラムを初めから実行させたりして、いくつかのエラーに対しては、エラーの存在を許すべきですが、プログラムは正常にタスクを完了することができます.
    デバッグテクニック
    1、VC++中F 5でデバッグ運転を行います.
    a)、output DebugウィンドウでTRACEで印刷された情報を見ることができます.
    b)、Call Stockウィンドウでは、プログラムの呼び出しスタックが見られます.
    2、Debugバージョンの運行時に崩壊が発生し、retryを選んでデバッグし、Call Stockを見てエラーの位置と原因を分析する.
    3、マッピングファイルでデバッグする
    a)マッピングファイルを作成する:Project settingsのlink項目、Generate mapfileを選択して、プログラムコードアドレスを出力する:/MAPINFO:LINE、引出し番号を得る:/MAPINFO:EXPORTS.
    b)プログラムのリリース時は、モジュールのマッピングファイルをすべて保存するべきです.
    c)マッピングファイルを見てください.「参照」は、崩壊した住所からソースコードのエラー行を探し出します.
    4、デバッグ可能なReleaseバージョン
    Project settingsの中でC++項のDebug InfoはProgram Databaseとして選択して、Link項のDebugの中でDebug InfoとMicrosoft formatを選択します.
    5、APIのエラーコードを確認し、watchウィンドウに@errを入力すると、確認または@err、hrができます.そのうち、hrはエラーコードの説明を表します.
    6、Set Next Sttement:この機能は指定されたコードラインに直接ジャンプして実行できます.普通は異常処理のコードをテストします.
    7、デバッグメモリ変数の変化:メモリが変化したら停止します.
    よくあるエラー
    1、関数が戻った時にプログラムが崩壊する原因
    a)自動変数の書き込みがオフになっています.
    b)、関数の原型が一致しない
    2、MFC
    a)エラーの関数プロトタイプを使ってユーザー定義メッセージを処理する
    正しい関数の原型は以下の通りです.
    afx_msg LRESULT OnMyMessage(WPARAM wParam,LPARAM lParam);
    3、Terminate Threadを慎重に使う:Terminate Threadを使うと資源が漏れてしまいます.万やむを得ず、使用しないでください.
    4、_を使うBeginnthreadexは、Create Threadを使用しないでください.