MSVC __debugbreak() 与 openGL 错误回调一起使用时不会产生调用堆栈
MSVC __debugbreak() when used with openGL error callback produces no callstack
我正在使用openGL最近的glDebugMessageCallback
约定来帮助我的openGL错误处理。我希望能够做的是有一种方法可以查看导致 openGL 错误的函数。我认为回调方法的唯一方法是在我的回调函数中插入断点,以便在 Visual Studio 中生成错误时,我可以返回并检查调用堆栈以查看究竟是什么函数导致了问题:
void GLAPIENTRY MyOpenGLErrorCallbackFunc(GLenum source, GLenum debugErrorType, GLuint errorID, GLenum severity, GLsizei length, const GLchar *message, const void *userParam)
{
switch(debugErrorType)
{
case GL_DEBUG_TYPE_ERROR:
{
BGZ_CONSOLE("GL Type error: %snGL error id: %in", message, errorID);
#if _MSC_VER
__debugbreak();
#endif
}break;
case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:
{
BGZ_CONSOLE("GL deprecated gl function usage error: %snGL error id: %in", message, errorID);
#if _MSC_VER
__debugbreak();
#endif
}break;
case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
{
BGZ_CONSOLE("GL undefined behavior error: %snGL error id: %in", message, errorID);
#if _MSC_VER
__debugbreak();
#endif
}break;
};
};
但是,当我尝试通过将无效枚举传递给其中一个 openGL 函数来测试这一点时,当程序确实中断时,我所有的调用堆栈都显示:
myProgram.exe!MyOpenGLErrorCallbackFunc(GLenum source, GLenum debugErrorType, GLuint errorID, GLenum severity, GLsizei length, const GLchar *message, const void *userParam)
[External code]
因此,我的代码没有执行树可供查看。有没有办法让它工作?
您必须启用同步调试输出:
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
如果调试输出是异步生成的,则可以从执行命令的线程以外的线程调用调试回调函数。请参 阅日志记录和glEnable
。
相关文章:
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么调用堆栈数组会导致内存泄漏
- 是否可以检查悬挂光纤的调用堆栈?
- MSVC __debugbreak() 与 openGL 错误回调一起使用时不会产生调用堆栈
- 了解使用堆栈实现队列的递归调用机制
- C++析构函数调用两次,堆栈分配的复合对象
- 以下代码如何工作以每次为唯一调用堆栈唯一实例化模板函数?
- OpenCV 3 Visual Studio 2017 调试,调用堆栈没有.pdb文件
- C/C++中全局调用堆栈的基础
- 是否可以访问代码中的调用堆栈?
- 使用在堆栈上创建的对象调用虚拟函数
- 为什么析构函数无休止地调用自己(导致堆栈溢出)?
- 调用堆栈显示 SIGBUS,这意味着什么
- 堆栈展开如何与析构函数调用有关?
- 打开C++故障转储不会在调用堆栈中显示正确的行
- 防止 CRTP 特征码在"pure virtual"调用中堆栈溢出
- 将参数推送到调用堆栈 (C++) 的可移植方法
- 从基类堆栈调用派生类实例
- 堆栈调用析构函数,即使遵循三规则
- 用于生成函数以从运行时堆栈调用带参数的函数的模板