gpt4 book ai didi

c++ - SymGetLineFromAddr 无法正常工作

转载 作者:太空狗 更新时间:2023-10-29 21:00:15 27 4
gpt4 key购买 nike

我有以下代码:

#include "stdafx.h"
#include <process.h>
#include <iostream>
#include <Windows.h>
#include "dbghelp.h"

using namespace std;

int LogStackTrace()
{
void *stack[1024];
HANDLE process = GetCurrentProcess();
SymInitialize(process, NULL, TRUE);
WORD numberOfFrames = CaptureStackBackTrace(0, 1000, stack, NULL);
SYMBOL_INFO *symbol = (SYMBOL_INFO *)malloc(sizeof(SYMBOL_INFO));
symbol->MaxNameLen = 1024;
symbol->SizeOfStruct = sizeof(SYMBOL_INFO);
IMAGEHLP_LINE *line = (IMAGEHLP_LINE *)malloc(sizeof(IMAGEHLP_LINE));
line->SizeOfStruct = sizeof(IMAGEHLP_LINE);
printf("Caught exception ");
for (int i = 0; i < numberOfFrames; i++)
{
SymFromAddr(process, (DWORD64)(stack[i]), NULL, symbol);
SymGetLineFromAddr(process, (DWORD)(stack[i]), NULL, line);
printf("at %s in %s, address 0x%0X\n", symbol->Name, line->FileName, symbol->Address);
}
return 0;
}

void function2()
{
int a = 0;
int b = 0;
throw new exception("Expected exception.");
}

void function1()
{
int a = 0;
function2();
}

void function0()
{
function1();
}

static void threadFunction(void *param)
{
try
{
function0();
}
catch (...)
{
LogStackTrace();
}
}

int _tmain(int argc, _TCHAR* argv[])
{
try
{
_beginthread(threadFunction, 0, NULL);
}
catch (...)
{
LogStackTrace();
}
printf("Press any key to exit.\n");
cin.get();
return 0;
}

问题是它总是在这一行出错:printf("at %s in %s, address 0x%0X\n", symbol->Name, line->FileName, symbol->Address );

原因是因为line的FileName好像是NULL。实际上,整个线路结构都乱七八糟。我正在尝试编写一个应用程序来显示错误的堆栈跟踪。但这是为什么呢?它不应该使用上面的代码吗? PS 我针对 Win32 将其编译为一个简单的 MSVC++ 控制台应用程序。

最佳答案

你的代码有同样的问题(Windows Seven 64b,Unicode 32 位构建,VS2012 Express)

修复它:

DWORD dwDisplacement;
SymGetLineFromAddr(process, (DWORD)(stack[i]), &dwDisplacement, line);

关于c++ - SymGetLineFromAddr 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22465253/

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