cod*_*r2k 2 c++ glfw visual-c++ visual-studio-2019 glad
我使用的是 Visual Studio 2019,并有以下简单的 OpenGL 程序作为最小示例(使用 GLFW 和 GLAD):
#include <iostream>
#include <glad/glad.h>
#include <GLFW/glfw3.h>
void error_callback(int error, const char* description) {
std::cout << "GLFW error: " << description << " (" << error << ")\n";
}
int main() {
if (!glfwInit()) exit(-1);
glfwSetErrorCallback(error_callback);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
GLFWwindow* window = glfwCreateWindow(640, 480, "GLFW Test Application", nullptr, nullptr);
if (!window) exit(-1);
glfwMakeContextCurrent(window);
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) exit(-1);
glViewport(0, 0, 640, 480);
glClearColor(0.6f, 0.6f, 0.1f, 1.f);
while (!glfwWindowShouldClose(window)) {
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
}
Run Code Online (Sandbox Code Playgroud)
该程序工作正常,但在运行时,我会在调试输出窗口中以几秒到大约 20 秒甚至更多秒的间隔收到类似以下内容的行:
Exception thrown at 0x00007FFE61EEA799 (KernelBase.dll) in vcpkg_test.exe: 0x0EEDFADE (parameters: 0x0000000001D0A34E, 0x000001C13E322BA0, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000).
Exception thrown at 0x00007FFE61EEA799 (KernelBase.dll) in vcpkg_test.exe: 0x0EEDFADE (parameters: 0x0000000001D0A34E, 0x000001C13DC7CE40, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000).
Exception thrown at 0x00007FFE61EEA799 (KernelBase.dll) in vcpkg_test.exe: 0x0EEDFADE (parameters: 0x0000000001D0A34E, 0x000001C13DC7CDE0, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000).
Run Code Online (Sandbox Code Playgroud)
该程序继续运行,工作正常,并以退出代码 0 退出。当我在 Visual Studio 之外执行 EXE 文件时,它也工作正常。当我将 VS 设置为在所有异常上中断时,我看到此调用中发生了异常(win32_init.c,“createHelperWindow”方法):
Exception thrown at 0x00007FFE61EEA799 (KernelBase.dll) in vcpkg_test.exe: 0x0EEDFADE (parameters: 0x0000000001D0A34E, 0x000001C13E322BA0, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000).
Exception thrown at 0x00007FFE61EEA799 (KernelBase.dll) in vcpkg_test.exe: 0x0EEDFADE (parameters: 0x0000000001D0A34E, 0x000001C13DC7CE40, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000).
Exception thrown at 0x00007FFE61EEA799 (KernelBase.dll) in vcpkg_test.exe: 0x0EEDFADE (parameters: 0x0000000001D0A34E, 0x000001C13DC7CDE0, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000).
Run Code Online (Sandbox Code Playgroud)
我已经在谷歌上花了几个小时试图找到解决方案。我得到的唯一“提示”是,当我以管理员身份运行 VS19 时,不会发生异常。有人知道是什么原因造成的吗?或者我应该忽略它,因为它运行良好?虽然这样感觉不太对劲……
我按照本回答中的提示进行操作(请参阅已接受的答案)。在启用第一次机会异常中断后,我得到了以下堆栈跟踪:

DLL“ammemb64.dll”也出现在模块窗口中。它属于“Actual Multiple Monitors”软件,关闭该应用程序后,异常消失了。
根据 Google 的说法,这是 Delphi 使用的操作系统异常(结构化异常)代码。由于您不是用 Delphi 编写,因此很可能某些用 Delphi 编写的程序正在挂接到所有正在运行的进程。当您在管理模式下运行时,您的进程具有足够的特权,挂钩无法触及它。
如果您想找到罪魁祸首,请在 Visual Studio 异常对话框中启用该异常代码作为第一次机会(“抛出时中断”而不仅仅是未捕获时)(右键单击“Win32 异常”条目并选择“添加”,然后您可以将能够有一个条目0x0EEDFADE)。查看堆栈跟踪,几乎可以肯定对的调用kernelbase.dll是通过某些第三方 DLL 进行的。
您还可以通过在调试时查看 Visual Studio 中的模块列表来获得线索,以查看哪些 DLL 加载到您的进程中,且与操作系统或 C++ 运行时无关。DLL 的路径名可能是一个致命的泄露点。
这是一个现有的问题,在调用过程中发生了未知(但不同)的异常CreateWindow,也是由于挂钩 DLL 造成的:Create CFrameWnd 给出了第一次机会异常 - 为什么?
我特别同意@IInspectable 在这个问题上留下的评论中的每一个字:
这可能是由桌面中运行的应用程序引起的,该应用程序安装了全局挂钩或导致代码使用其他基础设施在您的进程中运行。在处理程序内部会引发异常,然后被捕获(否则您会看到第二次机会异常,以及未捕获的异常对话框)。要解决此问题,您必须识别出现故障的应用程序,并将其从系统中删除。除此之外,你的代码没有任何问题。
这是钩子导致异常的同一问题的另一个实例: standard win32 wndproc 中的第一次机会异常
| 归档时间: |
|
| 查看次数: |
6087 次 |
| 最近记录: |