次のコードは、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 で機能することを確認しました。