0

次のコードは、VS2012 のデバッグ ビルドで期待どおりに機能します。

#include <SDKDDKVer.h>
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
#include <io.h>
#include <assert.h>

DWORD WINAPI childThread(LPVOID param) {
    printf("I'm the child!\n"); fflush(stdout);
    _isatty(-1);
    //assert(1==0);
    return 0;
}

void myInvalidParameterHandler(const wchar_t * expression, const wchar_t * function, const     wchar_t * file, unsigned int line, uintptr_t pReserved) {
    wprintf(L"%s:%i %s() - Invalid parameter [%s]", file, line, function, expression);
}

int _tmain(int argc, _TCHAR* argv[]) { 
    wprintf(L"Registering invalid parameter handler\n");
    _invalid_parameter_handler newHandler = myInvalidParameterHandler;
    _set_invalid_parameter_handler(newHandler);

    printf("Testing.\n");
    CreateThread(NULL, 0, childThread, NULL, 0, NULL);
    // CreateThread(NULL, 0, childThread, NULL, 0, NULL);
    printf("Thread(s) created, press Enter to exit.\n");
    getchar();
    return 0;
}

パラメーターの検証により、childThread から "Abort/Retry/Ignore" ポップアップが発生し、_isatty(-1)必要な限りそのままになります。「無視」を押すと、myInvalidParameterHandler が呼び出され、Enter キーを押すまでプログラムが実行されます。すべて良い。


2 番目のCreateThreadコメントが解除されているため、一度に 2 つのパラメーター検証エラーが発生した場合、プログラムはサイレントに終了します。Abort/Retry/Ignore がポップアップすることがありますが、1 秒以内に消えます。プログラムが main のためにぶらぶらすることはありませんgetchar

デバッガー内から実行すると、次のブレークポイントにヒットします。

msvcr110d.dll!_CrtDbgBreak() Line 87    C
msvcr110d.dll!_VCrtDbgReportW(int nRptType, void * returnAddress, const wchar_t * szFile, int nLine, const wchar_t * szModule, const wchar_t * szFormat, char * arglist) Line 506   C
msvcr110d.dll!_CrtDbgReportWV(int nRptType, void * returnAddress, const wchar_t * szFile, int nLine, const wchar_t * szModule, const wchar_t * szFormat, char * arglist) Line 262   C++
msvcr110d.dll!_CrtDbgReportW(int nRptType, const wchar_t * szFile, int nLine, const wchar_t * szModule, const wchar_t * szFormat, ...) Line 279 C++
msvcr110d.dll!_isatty(int fh) Line 41   C
assertTest.exe!childThread(void * param) Line 10    C++

これは同時アサーションの一般的な問題ではありません。と のコメントを交換する_isatty(-1)assert(1==0)、期待どおりの結果が得られます。2 つの中止/再試行/無視のポップアップが表示されます。それらはぶらぶらし、メイン スレッドは最後まで実行されます。

リリース ビルドにはこの問題はありません。両方のスレッドに対して無効なパラメーター ハンドラーが呼び出され、実行は常に続行されます。


_isatty(-1)コンテキストとして、複数のスレッドでヒットし、サイレントに終了する長時間実行サーバー プロセスがありました。これは修正済みの問題ですが、この動作により追跡が非常に困難になりました。何かお手伝いできることがないか考え中です。

同様の動作の質問を見ましたが、それは MinGW であり、コンパイラのバグであると判断されました。テストが VS2012 で機能することを確認しました。

4

1 に答える 1

1

それを理解しました-どういうわけか、レジストリでデバッグが無効になりました。彼らはキーインAutoがありHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebugませんでした。これを に設定すると1、キーで指定されたデバッガーDebuggervsjitdebugger が呼び出されました。もう何も消えません!

Watson の無効化についてhttp://support.microsoft.com/kb/188296からアイデアを得ました。

于 2013-06-28T21:24:09.047 に答える