【问题标题】:Exception thrown at 0x00007FF93E507A7A (ntdll.dll) .Access violation reading location 0xFFFFFFFFFFFFFFFF在 0x00007FF93E507A7A (ntdll.dll) 引发异常。访问冲突读取位置 0xFFFFFFFFFFFFFFFF
【发布时间】:2017-03-14 08:12:29
【问题描述】:

我正在使用 POCO lib 来工作网络。 我使用 POCO/JSON 的 JSON 数据。我的代码:

User user(context.marshal_as<std::string>(tbUserName->Text),
        context.marshal_as<std::string>(tbFullName->Text),
        context.marshal_as<std::string>(tbDisplayName->Text),
        context.marshal_as<std::string>(tbEmail->Text),
        context.marshal_as<std::string>(tbPhoneNumber->Text),
        context.marshal_as<std::string>(tbNamSinh->Text),
        context.marshal_as<std::string>(tbPassword->Text),
        context.marshal_as<std::string>(tbConfirm->Text)
    );
    string jsonString = user.serialize();

我在 Client_Winform.exe 中的 0x00007FF93E507A7A (ntdll.dll) 处抛出了错误异常:

0xC0000005:访问冲突读取位置0xFFFFFFFFFFFFFFFF。

如果有这个异常的处理程序,程序可以安全地继续。

【问题讨论】:

  • tbUserName 等声明和初始化的位置在哪里。听起来您正在取消引用未初始化的指针。
  • T 尝试重新初始化字符串但仍然无法

标签: c++ json poco-libraries


【解决方案1】:

使用 Visual Studio 的代码分析来跟踪代码中错误所在的确切位置。 https://msdn.microsoft.com/en-us/library/ms182028.aspx 这类错误信息的问题不在于理解原因(坏句柄),而在于寻找位置。由于您的代码通过编译没有错误,并且在许多情况下,将在多台机器上顺利运行并且仅在其中一台机器上崩溃,因此您需要关注崩溃的位置。

【讨论】:

    【解决方案2】:

    您正在使用从某个函数返回为 INVALID_HANDLE 的句柄(INVALID_HANDLE 为 -1 或 0xFFFFFFFFFFFFFFFF)。当您尝试使用它时,它被用作地址并且您没有访问该地址的权限(错误 5 是访问冲突)。

    【讨论】:

    • 错误代码行是:string jsonString = user.serialize();如果我删除代码行,程序仍然正常运行。我把完整的代码放到控制台仍然像往常一样运行,但运行 winform 失败
    【解决方案3】:

    当您确实有多平台项目(即程序集)时,可能会发生这种情况。意思是,如果您确实有一个 x86 项目和另一个 x64 项目。当您在错误的平台下构建项目时会出现问题。例如,在 x86 下和消费者代码中引用的 x64 程序集构建正在尝试调用特定函数。因为,对于这种混合平台化程序集,参考计算会导致 x00000005 或 xFFFFFFFF 类型的位置,这是侧 RAM(即操作系统部分)中的受限区域。因此,它会抛出具有“访问冲突异常读取位置...”之类的消息的异常。我找到的解决方案是确定并将确切的平台应用于相关项目。我再次从 repo 中检索到全新的代码并在特定平台下构建,这个问题就消失了。

    【讨论】:

      猜你喜欢
      • 2016-08-17
      • 2016-05-28
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多