为什么 SymGetSymFromAddr64 无法正常工作?它返回错误代码 126
Why isn't SymGetSymFromAddr64 working? It returns error code 126
我试图使用以下代码捕获异常的堆栈跟踪:
#include "stdafx.h"
#include <process.h>
#include <iostream>
#include <Windows.h>
#include "dbghelp.h"
using namespace std;
#define TRACE_MAX_FUNCTION_NAME_LENGTH 1024
void function2()
{
int a = 0;
int b = 0;
throw new exception;
}
void function1()
{
int a = 0;
function2();
}
void function0()
{
function1();
}
LONG WINAPI FatalExceptionFilter(EXCEPTION_POINTERS* exception, DWORD exceptionCode)
{
CONTEXT *context = exception->ContextRecord;
HANDLE thread = GetCurrentThread();
HANDLE process = GetCurrentProcess();
STACKFRAME64 frame;
DWORD image;
#ifdef _M_IX86
image = IMAGE_FILE_MACHINE_I386;
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;
#elif _M_X64
image = IMAGE_FILE_MACHINE_AMD64;
frame.AddrPC.Offset = context->Rip;
frame.AddrPC.Mode = AddrModeFlat;
frame.AddrFrame.Offset = context->Rsp;
frame.AddrFrame.Mode = AddrModeFlat;
frame.AddrStack.Offset = context->Rsp;
frame.AddrStack.Mode = AddrModeFlat;
#elif _M_IA64
image = IMAGE_FILE_MACHINE_IA64;
frame.AddrPC.Offset = context->StIIP;
frame.AddrPC.Mode = AddrModeFlat;
frame.AddrFrame.Offset = context->IntSp;
frame.AddrFrame.Mode = AddrModeFlat;
frame.AddrBStore.Offset = context->RsBSP;
frame.AddrBStore.Mode = AddrModeFlat;
frame.AddrStack.Offset = context->IntSp;
frame.AddrStack.Mode = AddrModeFlat;
#else
#error "This platform is not supported."
#endif
IMAGEHLP_SYMBOL64 *symbol = (IMAGEHLP_SYMBOL64 *)malloc(sizeof(IMAGEHLP_SYMBOL64)+(TRACE_MAX_FUNCTION_NAME_LENGTH - 1) * sizeof(TCHAR));
symbol->MaxNameLength = TRACE_MAX_FUNCTION_NAME_LENGTH;
symbol->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64);
IMAGEHLP_LINE64 *line = (IMAGEHLP_LINE64 *)malloc(sizeof(IMAGEHLP_LINE64));
line->SizeOfStruct = sizeof(IMAGEHLP_LINE64);
while (StackWalk64(image, process, thread, &frame, context, NULL, NULL, NULL, NULL))
{
DWORD64 displacement64;
if (SymGetSymFromAddr64(process, frame.AddrPC.Offset, &displacement64, symbol))
{
DWORD displacement;
if (SymGetLineFromAddr64(process, frame.AddrPC.Offset, &displacement, line))
{
printf("tat %s in %s: line: %lu: address: 0x%0Xn", symbol->Name, line->FileName, line->LineNumber, symbol->Address);
}
else
{
printf("Error from SymGetLineFromAddr64: %lu.n", GetLastError());
}
}
else
{
printf("Error from SymGetSymFromAddr64: %lu.n", GetLastError());
}
}
return EXCEPTION_EXECUTE_HANDLER;
}
static void threadFunction(void *param)
{
__try
{
function0();
}
__except (FatalExceptionFilter(GetExceptionInformation(), GetExceptionCode()))
{ }
}
int _tmain(int argc, _TCHAR* argv[])
{
_beginthread(threadFunction, 0, NULL);
printf("Press any key to exit.n");
cin.get();
return 0;
}
输出:Press any key to exit.
Error from SymGetSymFromAddr64: 126.
Error from SymGetSymFromAddr64: 126.
Error from SymGetSymFromAddr64: 126.
Error from SymGetSymFromAddr64: 126.
Error from SymGetSymFromAddr64: 126.
Error from SymGetSymFromAddr64: 126.
Error from SymGetSymFromAddr64: 126.
Error from SymGetSymFromAddr64: 126.
Error from SymGetSymFromAddr64: 126.
Error from SymGetSymFromAddr64: 126.
我有点困惑,为什么SymGetSymFromAddr64失败。什么好主意吗?
126应该是一个缺失的依赖,但我有DLL在适当的文件夹…我在Windows 8.1 x64 PC上使用Win32平台调试构建的msvc++控制台应用程序中运行这一切。那么是什么导致了这个问题呢?
Update: Dependency walker告诉我它找不到API-MS-WIN-SERVICE-PRIVATE-L1-1-1.DLL
你的代码也有同样的问题
修复:
HANDLE process = GetCurrentProcess();
SymInitialize( process,NULL,TRUE );
注意:现在,SymGetLineFromAddr64
对一些大地址失败,错误487 (ERROR_INVALID_ADDRESS
)
使用以下代码进行跟踪:
printf("Error from SymGetLineFromAddr64: %lu for address 0x%I64x.n",
GetLastError(),
frame.AddrPC.Offset);
编辑:当我在Visual Studio中使用Go to Disassembly并输入使SymGetLineFromAddr64
失败的第一个地址(这里,它是0x000000005a03da08
)时,它显示了源代码:
f: dd vctools crt_bld crt prebuild 嗯 self_x86 throw.cpp
相关文章:
- 当命令失败时,gzip 会在 C++ 中返回错误代码吗?
- openCL-创建子缓冲区返回错误代码13
- 如何从构造函数返回错误代码?
- 如何使用 RAII 包装返回错误代码的 C 分配
- ChangeWindowMessageFilterEx() 返回错误代码 5
- mmdevice API中的cocreateinstance返回错误代码0x800401f0
- Ubuntu E:子进程 /usr/bin/dpkg 返回错误代码 (1)
- GetProcAddress 在 c++ 中返回错误代码 127
- C++错误处理-使用std::pair或std::tuple返回错误代码和函数返回的缺点
- Windows GDI API是否在GetLastError中返回错误代码
- ldap_search函数使用 C++ Win32 API 返回错误代码 10
- C++ WinSock Recv 在接收 0 数据时终止线程而不是返回错误代码
- 以双精度返回错误代码
- QMutexLocker 是否返回错误代码(如果有)
- SetPixelFormat 返回 0 错误代码 3221684230 (C0070006)
- sqlite3_prepare_v2返回错误1代码
- WriteFile返回错误代码995
- 创建进程为用户返回错误代码 2
- 项目 :错误 PRJ0019:工具从 "Performing Pre-Build Event..." 返回错误代码
- FindResourceW()返回错误代码127