c++ - 如何在顶级过滤器中获取 Win32 崩溃的字符串描述(我正在寻找堆栈顶部指令的地址)

标签 c++ winapi exception-handling crash-dumps minidump

如果我使用类似 one described here 的类/方法如何在堆栈顶部获取调用的描述/地址?

基本上我想要一些可以在调用我们的错误跟踪系统时使用的值。我想根据导致异常的指令的地址“唯一”标识。

(通常是 mydll.dll 的形式!1234ABDC())

编辑:

一些背景信息:

我正在创建一个小型转储以通过电子邮件发送到缺陷跟踪系统 (fogbugz)。为了减少重复,我试图为崩溃想出一个合理的“签名”。我知道有一个用于 FB 的 xml PI,但它需要用户登录,我们还不确定我们是否能够负担得起让人们嗅探我们的流量并获取用户信息。电子邮件现在也更容易实现。稍后我们将使用 XML API 提交小型转储。

最佳答案

您需要将执行此操作的代码放在异常过滤器中,当您到达异常处理程序时,异常的大部分上下文信息已经丢失。

try 
{
  // whatever
}
except (MyExceptionFilter(GetExceptionInformation()))
{
}

你的过滤器看起来像这样

LONG WINAPI MyExceptionFilter (
   EXCEPTION_POINTERS * pExcept,
   BOOL                 fPassOn)
{
   EXCEPTION_RECORD * pER = pExcept->ExceptionRecord;
   DWORD dwExceptionCode = pER->ExceptionCode;

   TCHAR szOut[MAX_PATH*4]; // exception output goes here.
   szOut[0] = 0;

   MEMORY_BASIC_INFORMATION mbi;
   DWORD cb = VirtualQuery (pER->ExceptionAddress, &mbi, sizeof(mbi));
   if (cb == sizeof(mbi))
      {
      TCHAR szModule[MAX_PATH];
      if (GetModuleFileName ((HMODULE)mbi.AllocationBase, szModule, MAX_PATH))
         {
         wsprintf(szOut, "Exception at '%s' + 0x%X", szModule, 
                  (ULONG_PTR)pER->ExceptionAddress - (ULONG_PTR)mbi.AllocationBase);
         }
      }

   return EXCEPTION_EXECUTE_HANDLER;
}

当然,您需要针对 64 位架构稍微调整输出,因为在这种情况下 ExceptionAddress 和 AllocationBase 将是 64 位数量。

关于c++ - 如何在顶级过滤器中获取 Win32 崩溃的字符串描述(我正在寻找堆栈顶部指令的地址),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2359263/

相关文章:

c++ - std c++ 容器元素销毁和插入行为

c++ - 当您在公式中分配变量时会发生什么?

c++ - 批量导入包含在 Eclipse for Opencv 中

c# - Windows 7左键单击时钟弹出窗口

java - 为什么 "throw null"没有在 Java 中创建编译错误?

C++模板重构/泛化

winapi - 监视虚拟内存区域 (Win32)

c# - 如何查找使用设备的所有进程

c# - WCF 错误 : extension could not be loaded

python - python 的 `os.system` 会抛出异常吗?