SymGetLineFromAddr not working properly(SymGetLineFromAddr 无法正常工作)
问题描述
我有以下代码:
#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
", 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.
");
cin.get();
return 0;
}
问题是它总是在这一行出错:printf("at %s in %s, address 0x%0X
", symbol->Name, line->FileName, symbol->地址);
The problem is that it always errors out at this line: printf("at %s in %s, address 0x%0X
", symbol->Name, line->FileName, symbol->Address);
原因是因为 line 的 FileName 似乎为 NULL.实际上,整个线路结构是混乱的.我正在尝试编写一个应用程序来显示错误的堆栈跟踪.但这是为什么呢?它不应该使用上面的代码工作吗?PS 我针对 Win32 编译它,作为一个简单的 MSVC++ 控制台应用程序.
The reason is because line's FileName seems to be NULL. Actually, the entire line structure is messed up. I am trying to write an application to show a stack trace on an error. But why is that? Shouldn't it be working using the above code? PS I compiled it against Win32, as a simple MSVC++ Console application.
推荐答案
你的代码有同样的问题(Windows 7 64b,Unicode 32 位构建,VS2012 Express)
Had the same problem with your code (Windows Seven 64b, Unicode 32 bits build, VS2012 Express)
修复它:
DWORD dwDisplacement;
SymGetLineFromAddr(process, (DWORD)(stack[i]), &dwDisplacement, line);
这篇关于SymGetLineFromAddr 无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:SymGetLineFromAddr 无法正常工作
基础教程推荐
- 为什么我们不能使用“虚拟继承"?在 COM 中? 2022-01-01
- 如何在 C++ 中正确使用命名空间? 2022-01-01
- c++ STL设置差异 2022-01-01
- 与 CAS 的原子交换(使用 gcc 同步内置函数) 2022-01-01
- 提升 ASIO 流缓冲 2021-01-01
- 如何更改 SysDateTimePick32 或 CDateTimeCtrl 的背景颜色? 2022-01-01
- 如何部分禁用 cmake C/C++ 自定义编译器检查 2021-01-01
- C++:获取传递给函数的多维数组的行大小 2021-01-01
- 将不可复制的闭包对象传递给 std::function 参数 2021-01-01
- 随机插入/删除的综合向量与链表基准 2022-01-01
