【发布时间】:2019-02-11 18:15:49
【问题描述】:
我试图制造一个“堆栈溢出”异常。
此代码在 x64 调试时引发异常。
void DumpSystem::makeStackOverflow()
{
static int callCount = 0;
++callCount;
makeStackOverflow();
}
但是,此代码不会在 x64 版本上引发异常 x64 Release xxx.exe 是 LOOP,不会导致“堆栈溢出”异常。
构建选项:“SEH(/EHa)”
我想使用“SetUnhandledExceptionFilter”创建一个“转储文件”。
这是我使用的代码
LONG saveDumpfile(EXCEPTION_POINTERS* ex);
unsigned __stdcall saveDumpFileForStackOverflow(void* arg)
{
EXCEPTION_POINTERS* ex = static_cast<EXCEPTION_POINTERS*>(arg);
return saveDumpfile(ex);
}
LONG exceptionHandling(EXCEPTION_POINTERS* ex)
{
if (ex &&
ex->ExceptionRecord &&
ex->ExceptionRecord->ExceptionCode == EXCEPTION_STACK_OVERFLOW)
{
HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0,
saveDumpFileForStackOverflow, ex, NULL, NULL);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
return EXCEPTION_EXECUTE_HANDLER;
}
return saveDumpfile(ex);
}
void registrationDumpSystem()
{
::SetUnhandledExceptionFilter(exceptionHandling);
}
LONG saveDumpfile(EXCEPTION_POINTERS* ex)
{
if (ex == NULL)
return EXCEPTION_EXECUTE_HANDLER;
LONG result = EXCEPTION_EXECUTE_HANDLER;
//%APPDATA% : C:\Users\[user name]\AppData\Roaming
wstring filePath = getAppDataFolderPath();
SHCreateDirectoryEx(NULL, filePath.c_str(), NULL);
filePath.append(TEXT("\\Dump.dmp"));
HANDLE file = CreateFile(filePath.c_str(),
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
if (file == INVALID_HANDLE_VALUE)
{
DWORD lerr = GetLastError();
return lerr;
}
HANDLE processHandle = GetCurrentProcess();
DWORD processId = GetCurrentProcessId();
MINIDUMP_EXCEPTION_INFORMATION mei;
mei.ThreadId = GetCurrentThreadId();
mei.ExceptionPointers = ex;
mei.ClientPointers = false;
MiniDumpWriteDump(processHandle, processId, file,
MiniDumpNormal, &mei, NULL, NULL);
CloseHandle(file);
return result;
}
main.cpp
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
registrationDumpSystem();
//to do
return 0;
}
“x64 Debug exe”它可以工作。 所以我可以制作“dump.dmp”文件。
但是,“x64 release exe”不起作用。 我无法制作“dump.dmp”文件
enter image description here 我想知道为什么程序在 x64 版本上不退出。
请问,你能告诉我这个原因吗?
【问题讨论】:
-
编译器可能做了尾调用优化,有效地将你的递归函数变成了一个循环。尝试在递归函数调用之后添加一个有意义的语句。
-
@Max 请不要在 cmets 部分提供技术回复/答案。谢谢!
-
@LightnessRacesinOrbit 如果我不确定并且没有时间调查/确认但想为其他人留下指针,我该怎么办?
-
我将使用更复杂的代码。谢谢!!!
-
@Max:没什么。你没有必须写点什么。但是把它丢在这里,你偷走了我们对你的贡献进行同行评审的能力。由于您自己承认您不确定它实际上是否准确,因此这是双重不利的。如果你不确定答案是什么,你可以把它留给有答案的人。 (同样,如果您没有时间,请留给有时间的人。)
标签: c++