gpt4 book ai didi

c++ - CRT 参数验证使多线程调试程序崩溃

转载 作者:行者123 更新时间:2023-11-28 07:32:38 27 4
gpt4 key购买 nike

以下代码在 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;
}

参数验证会导致子线程的 _isatty(-1) 出现“中止/重试/忽略”弹出窗口,并且只要有必要它就会一直存在。如果我点击“忽略”,则会调用 myInvalidParameterHandler,程序会一直运行,直到我点击 Enter。一切都好。


如果第二个 CreateThread 未被注释,因此会同时发生两次参数验证失败,然后程序会静默退出。有时会弹出 Abort/Retry/Ignore,但一秒后就消失了。该程序永远不会等待 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) 的注释,那么它会按照我的预期进行。我们得到两个中止/重试/忽略弹出窗口,它们在附近徘徊,主线程运行完成。

发布版本没有这个问题,为两个线程调用无效参数处理程序并且执行始终继续。


对于上下文,我们有一个长时间运行的服务器进程,它在多个线程中命中 _isatty(-1) 并静默退出。这是一个我们已经解决的问题,但这种行为使得追踪起来非常困难。我想知道是否可以做些什么来提供帮助。

我看到一个question with similar behavior , 但那是 MinGW & 被确定为编译器错误。我已验证该测试在 VS2012 中有效。

最佳答案

弄清楚了 - 不知何故我在我的注册表中禁用了调试。他们在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug 中键入 Auto 丢失。将其设置为 1 会导致调用 Debugger 键中命名的调试器 vsjitdebugger。什么都不会消失!

灵感来自 http://support.microsoft.com/kb/188296关于禁用 Watson。

关于c++ - CRT 参数验证使多线程调试程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17367986/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com