スペース地上ステーションサーバの非正常なシャットダウン問題の分析


1.問題現象


地理的な場所で実行中、サーバ・プログラムがデバッグ・ウィンドウで異常に閉じるという問題が発生することがあります.

2.原因分析


2-1. ポップアップ・エラー・メッセージの分析

  • Debug Assertion Failed→プログラムが正常に動作するために必要な環境条件をチェックし、プログラムが正常でない場合、プログラムのメッセージを終了して出力する
  • (_osfile(fth) & FOPEN)→正常な検査に使用する環境条件で文法を検査し、この文法検査は失敗したことを確認する
  • write.c→ファイルのオープン/書き込み/読み取りなどに関するFramework(Visual Studio 2005)内部ソースコード
  • 2-2. エラーメッセージが発生する可能性のある仮定を確立


    (1)閉じたファイルの書き込みを試みる.

  • エラーメッセージに従って、Framework(Visual Studio 2005)が作成されます.cファイルの関連コード分析(C:プログラムファイル(x 86)Microsoft Visual Studio 8VCcrtsrcwrite).c)
  • の解析結果は、他のスレッドによって閉じられたファイルを書き込もうとすると、
  • というエラーが発生する可能性があることを示しています.
    int __cdecl _write(int fh, const void* buf, unsigned cnt) {    	
        
        ... 
         // 68번 라인, 디버그 모드에서 Asssertion 구문 
        _VALIDATE_CLEAR_OSSERR_RETURN((_osfile(fh) & FOPEN), EBADF, -1);
        ...
        // 릴리즈 모드에서 위와 동일한 역할 수행  
        if (_osfile(fh) & FOPEN) {
        	...
            
        } else {
            ...
            // 릴리즈 모드에서 출력 될 오류 메시지
            _ASSERTE(("Invalid file descriptor. File possibly closed by a different thread", 0)); 
        }
    
        return r;
    }

    (2)512個以上のファイルを同時に開いて書き込んでみる

  • サーバプログラムで使用するオペレーティングシステムリソースハンドルは、実行中に累計増加(以下、起動後数日以内に累計するハンドル値を示す)
  • .
  • エラーメッセージはファイルに関係しており、ファイルリソースが割り当てられていないことと解放されていないことによる問題であると推測し、理論的背景の中で探索
  • を行う.
  • マイクロソフトのWebサイトで確認し、512以上のファイルを同時に開こうとすると、エラーが発生する可能性があります.
    C run-time I/O now supports up to 8,192 files open simultaneously at the low I/O level. This level includes files opened and accessed using the _open, _read, and _write family of I/O functions. By default, up to 512 files can be open simultaneously at the stream I/O level. This level includes files opened and accessed using the fopen, fgetc, and fputc family of functions.
  • ビット目のエラーをシミュレートすることにより、我々のシステムのエラーウィンドウ
  • と同様の
    for (int i = 0; i < 512; i++) {	
        
        str.Format("D:\\%d.txt", i);
    
        errno_t e = fopen_s(&fp, str, "w");
        
        int ret = fwrite("test", sizeof(char), strlen("test"), fp);
    }

    2-3. ファイル計算ログの収集

  • プロセス監視ユーティリティによるサーバプログラム実行時ファイルに関するAPI呼び出しログの収集
    プロセスモニタの使用方法
  • プログラムから衛星通信が完了するまで、約7万回線のログ収集

  • 2-4. ログ解析

  • 7万行ログ分析の自動化開発ユーティリティ2
  • ユーティリティは、次の2つのエラーがあるかどうかを確認します.
  • マルチスレッド環境で閉じたファイルの書き込みを試みる場合、
  • .
  • 512以上のファイルを同時に開いて書き込む場合、
  • ログ解析結果エラーログは見つかりませんでした
  • マルチスレッド環境においてクローズファイルの書き込みを試みるファイル
  • はない.
  • には複数のスレッドで同時に開くファイルがありますが、読み取り専用であり、
  • には影響しません.
  • は、512以上のファイル
  • を同時に開いて書き込むことを試みていない.
  • 同時に最大7個のファイル
  • を開く.

    2-5. 実行可能ファイル(EXE)とライブラリファイル(DLL)の相関分析

  • googlingによってStack Overflowサイトで私たちと似たようなエラーを発見し、解決しました.
  • 実行可能ファイル(EXE)とライブラリファイル(DLL)のRuntime-Library設定が異なると問題が発生し、これらの設定を調整することで問題が解決する
  • .

  • サーバー・プログラムがファイルと使用するすべてのライブラリ・ファイルの設定を実行できることを確認し、同じ設定が正しいことを確認します.

  • 使用中のDLLファイルの中にはソースコードがないものもあり、Walkerツールに依存してステータスチェックを行います(MFC 80 D.DLL、MSVCR 80 D.DLLに相関がある場合は、マルチスレッドDLL設定であることを確認します)

  • 2-7. エラーの再生時にProcDumpプログラムログを解析する


  • Proc Dumpプログラムを使用して、プログラムが正常に終了しない場合にプログラムコンテキスト(ソースファイル、関数、ソース線、呼び出しスタックなど)を確認します.
    ProcDumpプログラムの使用例

  • ダンプファイル 異常終了点のコードが確認され、特定のソースコードのfopen以降のfwrite呼び出し中に異常終了が確認されました

  • このコードは、毎秒約13000バイトのサイズのログをファイルに記録し、本番チームとともにログが未使用のゴミログであることを確認し、関連コードを削除します.

  • fwrite()呼び出し時にプログラムがハングアップした理由を特定できません

  • 3.処理結果

  • 問題コードを削除すると、これまで同様の問題は発生しなかった
  • .