c++ - 调用 SymGetLineFromAddr64() 和 SymGetSymFromAddr64() WinAPI 函数后,我们得到什么地址?

标签 c++ winapi

[IMAGEHLP_SYMBOL64][1] *pSym = NULL;
[IMAGEHLP_LINE64][2] Line;
STACKFRAME64 s; 
int d = 0;

//In my code I obtain the return address from the stack frame of function foo() which was called from function bar() and assign it to s.AddrPC.Offset. Now I call - 

SymGetLineFromAddr64(this->m_hProcess, s.AddrPC.Offset, &(d), &Line) 

SymGetSymFromAddr64(this->m_hProcess, s.AddrPC.Offset, &(d), pSym))

//We pass the current process HANDLE
//pSym->Name = bar

这些包含哪些地址?

Line.Address;

pSym->Address; 

找到了! pSym->Address 给出函数名的虚拟地址

很长一段时间以来,我一直在努力解决这个问题。任何帮助将不胜感激。

最佳答案

这是您要查找的内容:

来自 help pageIMAGEHLP_SYMBOL64的结构如下:

typedef struct _IMAGEHLP_SYMBOL64 {
  DWORD   SizeOfStruct;
  DWORD64 Address;
  DWORD   Size;
  DWORD   Flags;
  DWORD   MaxNameLength;
  TCHAR   Name[1];
} IMAGEHLP_SYMBOL64, *PIMAGEHLP_SYMBOL64;

Address符号的地址。

在您的情况下,pSym->Address 似乎是函数名称的虚拟地址

这个问题和StackWalk64 on Windows - Get symbol name也很相似.

关于c++ - 调用 SymGetLineFromAddr64() 和 SymGetSymFromAddr64() WinAPI 函数后,我们得到什么地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4570164/

相关文章:

Linux 上的 C++ 动态共享库

c++ - STL容器中的value_type有什么用?

C++ 执行 CMD 命令

multithreading - 父GUI对话框线程的子线程可以创建子窗口吗?

c++ - 如何使用 Clang 编译 C++?

c++ - 无法删除数组(我不知道的错误)

c++ - 在 C++ 中,是否有更有效的方法来编写多个声明

c++ - 如何在 MSVC 中获取成员函数指针?

c++ - 来自另一个线程的 SendMessage() 调用是否将消息发送到消息队列?

我可以指定允许向我发送连接请求的 IP 地址和端口号吗?