为什么 SymGetSymFromAddr64 不工作?它返回错误代码 126

2023-11-30

我正在尝试使用以下代码捕获异常的堆栈跟踪:

#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%0X\n", 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;
}

Output:

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...我正在使用 Win32 平台调试版本在 Windows 8.1 x64 PC 上的 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 中使用“转到反汇编”并输入第一个地址时SymGetLineFromAddr64失败(这里是0x000000005a03da08),它显示了以下内容的源代码:

f:\ dd \ vctools \ crt_bld \ self_x86 \ crt \ prebuild \ eh \ throw.cpp

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 SymGetSymFromAddr64 不工作?它返回错误代码 126 的相关文章

随机推荐

  • 使用 PHP GD 图像库着色和交换颜色?

    您好 我正在尝试使用 PHP 的 GD 图像库对图像进行着色和交换颜色 我正在使用位于此处的原始图像 http korlon com youknowbetter test jpg 并希望它达到橙色的脸 黑色的衣服和头发 就像你在这里看到的那
  • Autohotkey:发送 5 位十六进制 unicode 字符

    我一直在尝试找到一种方法来重新映射键盘并发送 5 位十六进制 unicode 字符 方法如下所述 ahk Send只支持 4 位十六进制代码 U nnnn 我知 道在过去 autohotkey 本身不支持 unicode 因此需要一些函数才
  • 查找用户是否正在通话?

    我想查看用户是否正在使用该应用程序以及他们是否正在打电话 我正在点击此链接来检查用户是否正在通话 iOS 如何检查当前是否正在通话 然而 这看起来像是针对 Objective C 的 我想知道是否有一个 Swift 等价的东西 这是我的尝试
  • ng-click 不适用于 ng-bind-html

    我有这样的 html 模板 scope template span class pointer i class icon refresh pointer i span 我想使用绑定这个模板ng bind html 我尝试使用它 也使用过ng
  • Django JQuery 自动完成

    我正在尝试向我的表单添加自动完成字段 但我无法去上班 我几乎尝试了所有教程 请求发送正常 我收到 200 响应 在开发人员工具窗格中 当我单击请求时 在 响应 选项卡上我会看到整个 HTML 文件 不应该有一个 json 格式的东西吗 这是
  • System.out.println 错误 新程序员

    我正在尝试执行一个简单的输入程序 但出现错误System out println命令 我不知道为什么它不接受该命令并且在我修复它之前无法继续工作 错误说 Multiple markers at this line Syntax error
  • Populate() 引用嵌套在对象数组中

    我正在尝试使用 Show 模型中的数据填充 我的 User 模型中的所有订阅 我尝试过 populate subscriptions show 但它对结果没有任何作用 如果我将订阅设为一个简单的参考数组 如下所示 subscriptions
  • htaccess 只接受来自特定 http_referer 的流量

    我正在尝试设置一个 htaccess 文件来完成以下任务 仅当查看用户来自特定域时才允许查看我的网站 链接 那么 举例来说 我有一个名为 保护 mydomain com 我只希望来自 unprotected mydomain com 上的链
  • 使用 mbox Python 模块解码并访问 mbox 文件

    我需要将电子邮件数据库迁移到 CRM 但有两个问题 我可以访问 mbox 文件 但内容未正确解码 我想创建一个类似数据框的结构 其中包含以下列 日期 发件人 收件人 主题 正文 我已经尝试过以下方法 for i message in enu
  • Java 中整数到字节的转换

    在Java中我们可以做 byte b 5 但是为什么我们不能将相同的参数传递给接受的函数byte myObject testByte 5 public void testByte byte b System out println Its
  • RESTEasy - 动态添加资源类

    通过 RESTEasy 我实现了 Application 的子类来提供单例资源列表 有没有办法稍后动态添加另一个单例 我还没有从 API 文档中找到实现这一点的方法 我自己没有尝试过 但我找到了一篇博客文章 其中描述了这一点 http sa
  • 在 fltk 窗口内绘制 gnuplot 图形

    我正在编写一个程序 它使用用 fltk 打开的窗口绘制 3D 对象 虽然我真的想在同一个窗口 除了 3D 对象 中添加一些 gnuplot 的图形 因为它们比 OpenGl 的图形更漂亮 那可能吗 我正在致力于模拟对象的运动并用 OpenG
  • 通过进程名称取消隐藏进程?

    前段时间我写了一段代码来隐藏 恢复进程窗口 我所做的是这样的 隐藏进程 1 在正在运行的进程中查找进程名 2 将 MainWindowHandle 添加到容器 在本例中为字典 这对于稍后取消隐藏该进程是必要的 3 使用ShowWindow
  • 如何获取视频的最后一帧?

    我想要视频的最后一帧 我的代码如下所示 let asset AVURLAsset AVURLAsset URL videoURL options nil let generate AVAssetImageGenerator AVAssetI
  • 如果文件已经打开,fopen 是否返回 NULL 指针?

    我当时假设fopen回报NULL指针 如果文件已打开 但看起来fopen不返回NULL如果文件已在以下位置打开 w 模式 下面是我用来尝试此操作的代码 但没有收到任何错误 我尝试使用 mingw32 以及 TDM GCC 64 编译器 如果
  • MVC2:是否有用于原始 Html 的 Html Helper?

    是否有一个 Html 助手可以简单地接受并返回原始 html 而不是做这样丑陋的事情 h2 Results h2 我想做这样的事情 虽然不是很干净 但我认为这是一个进步 存在这样的东西吗 或者是否有比使用 Html 助手更好的替代方法来从这
  • Mysql问题:没有mysql.sock

    昨天我正在使用安装在我的计算机上的 MySQL 进行工作 我下载了xampp 所以我改变了my cnf文件到套接字的路径 opt lampp var mysql mysql sock 该文件就在那里 今天我想继续处理它 我发现该文件不再存在
  • 选择所有行及其在单个查询中的计数

    我有一些名为 items 的表 想要从中获取一些行并在单个查询中计数 全部 现在我正在尝试这样的操作 SELECT COUNT as count SELECT FROM items WHERE as items FROM items 但我得
  • NSDictionary 对象中的非字符串键?

    我已经使用 Foundation 框架中的 NSJSONSerialization 解析了一些 JSON 数据 但是 我得到了 NSDictionary 组的奇怪密钥 如下所示 stop times departure time 5 48a
  • 为什么 SymGetSymFromAddr64 不工作?它返回错误代码 126

    我正在尝试使用以下代码捕获异常的堆栈跟踪 include stdafx h include