Ubuntu下glfwCreateWindow触发SIGSTOP中断GDB调试的解决方法
问题:Ubuntu下GDB调试glfwCreateWindow时被SIGSTOP中断
在Ubuntu系统上用GDB调试应用程序时,执行到glfwCreateWindow函数后,单步执行到下一行会被SIGSTOP信号中断,无法正常继续调试。相关代码如下:
glfwSetErrorCallback(error_callback); if (!glfwInit()) { printf("Couldn't init GLFW \n"); return -1; } GLFWwindow* window = nullptr; //glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); //glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); //glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GLFW_TRUE); window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL); if (!window) { glfwTerminate(); printf("Couldn't open window \n"); return -1; } // Make the window's context current glfwMakeContextCurrent(window);
希望能正常完成glfwCreateWindow的单步调试,该如何解决?
解决方法
临时忽略SIGSTOP信号
在GDB会话中直接输入以下命令:handle SIGSTOP nostop noprint pass这条命令让GDB不对SIGSTOP信号做暂停、打印操作,直接把信号传递给程序处理,能快速恢复单步调试流程。
永久配置GDB忽略SIGSTOP
编辑~/.gdbinit文件,添加一行:handle SIGSTOP nostop noprint pass之后每次启动GDB都会自动应用这个设置,不用重复输入命令。
改用GLFW调试版本
如果用的是系统预装的GLFW(比如apt安装的libglfw3),大多是不带调试符号的发行版。可以自己编译调试版本:- 克隆GLFW源码
- 编译时添加
-DCMAKE_BUILD_TYPE=Debug参数 - 让项目链接本地编译的调试版库
带调试符号的GLFW能提供更准确的调试信息,减少信号异常触发概率。
排查X11窗口系统干扰
glfwCreateWindow会和X11交互,部分桌面特效或窗口管理器插件可能触发SIGSTOP信号。调试时可以临时关闭不必要的桌面特效,减少外部信号干扰。
内容的提问来源于stack exchange,提问作者Yuriy
相关产品推荐
相关产品推荐

