gpt4 book ai didi

c++ - 输出程序崩溃时的调用堆栈以及符号名称

转载 作者:行者123 更新时间:2023-11-30 03:18:16 33 4
gpt4 key购买 nike

我想在捕获到未处理的异常并且我的程序崩溃时输出调用堆栈。我想在程序还活着的时候做这件事,没有任何事后分析。

我宁愿不使用任何第三方库,这是大多数类似问题的答案所暗示的。我在这里尝试使用 StackWalk。

我正在尝试让它在 Windows 上运行。

这是我所拥有的:

DWORD machine = IMAGE_FILE_MACHINE_I386;

HANDLE process = GetCurrentProcess();
HANDLE thread = GetCurrentThread();
CONTEXT context = {};
context.ContextFlags = CONTEXT_FULL;
RtlCaptureContext(&context);

SymInitialize(process, NULL, TRUE);
SymSetOptions(SYMOPT_LOAD_LINES);

STACKFRAME frame = {};
frame.AddrPC.Offset = context.Eip;
frame.AddrPC.Mode = AddrModeFlat;
frame.AddrFrame.Offset = context.Ebp;
frame.AddrFrame.Mode = AddrModeFlat;
frame.AddrStack.Offset = context.Esp;
frame.AddrStack.Mode = AddrModeFlat;

while (StackWalk(machine, process, thread, &frame, &context, NULL, SymFunctionTableAccess, SymGetModuleBase, NULL))
{
char * functionName;
char symbolBuffer[sizeof(IMAGEHLP_SYMBOL) + 255];
PIMAGEHLP_SYMBOL symbol = (PIMAGEHLP_SYMBOL)symbolBuffer;
symbol->SizeOfStruct = (sizeof IMAGEHLP_SYMBOL) + 255;
symbol->MaxNameLength = 254;

if (SymGetSymFromAddr(process, frame.AddrPC.Offset, NULL, symbol))
{
functionName = symbol->Name;
std::string str(functionName);

std::wstring stemp = std::wstring(str.begin(), str.end());
LPCWSTR sw = stemp.c_str();

MessageBox(NULL, sw, L"Error", MB_ICONERROR | MB_OK); //for testing purposes
if (str.find("nvd3dum") != std::string::npos) {
//I'd put a messagebox here telling the user to do something if I find a symbol name I recognize
}
}
}

我遇到的问题是,我没有输出程序崩溃时的调用堆栈,而是得到了这个被调用的函数,以及我在这个函数中使用的 RtlCaptureContext 之类的东西。

最佳答案

我解决了。我看到很多人和我有同样的问题。把它放在正确的上下文中!

CONTEXT context = {};
context.ContextFlags = exceptionInfo->ContextRecord->ContextFlags;
context.Eip = exceptionInfo->ContextRecord->Eip;
context.Ebp = exceptionInfo->ContextRecord->Ebp;
context.Esp = exceptionInfo->ContextRecord->Esp;

关于c++ - 输出程序崩溃时的调用堆栈以及符号名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54848491/

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