【发布时间】:2017-10-06 23:08:13
【问题描述】:
让我们从描述发生的事情开始:
我在 Windows 上使用 SDL2 库。我可以使用它编译程序,当我运行 .exe 时它工作得很好。当我尝试使用 GDB 调试它时出现问题 - 当代码到达 SDL_Init 或 SDL_OpenAudio 函数(可能创建新线程)时,GDB 停止,显示“程序收到信号?,未知信号”消息,当我恢复执行时程序崩溃。
显然 GDB (https://www.mail-archive.com/cygwin@cygwin.com/msg149735.html) 中存在与线程命名相关的错误,应该在 GDB 版本 7.11.1-1 中修复。
起初我使用 GCC 5.1.0 (TDM) 和 GDB 7.6.1,所以我决定更新到更新的版本。看起来 TDM 从大约两年前开始就没有提供任何更新,所以我安装了 MinGW-w64(我现在不记得了,但它可能是 GDB 的 7.11 版)。没有帮助,GDB 仍然崩溃。
接下来我搜索了更新版本的 GDB,并找到了 7.12(www dot equation dot com/servlet/equation.cmd?fa=gdb)。也没有用,可能是这个版本没修复。
显然这个错误应该只存在于 x86 版本的 GDB 中,所以我安装了 x64 版本的 TDM(GCC 5.1.0 和 GDB 7.9.1)。程序编译正常,但 GDB 仍然捕获未知信号和程序崩溃。
现在我实际上无法使用 SDL2 调试任何程序。所以,问题是,我该怎么做才能让它再次工作?
可能的解决方案:
- 使用 Visual Studio - 我喜欢 Eclipse(这意味着我开始容忍我不喜欢的东西)并且不想学习全新的 IDE,但我会保留它作为最后的选择。
- 编译 GDB - 试过了,但没用,在 Windows 上编译东西几乎不适合我,而且 GDB 7.12 也有这个错误。
- 切换到 Linux - 比迁移到 Visual Studio 更激进的选择。
- 回退到 SDL 1.2 - 那时事情变得更容易...
- 切换到任何其他库 - ...并希望他们能与 GDB 合作。这听起来不像是一个解决方案。
- 切换到不同的编译器?
- 禁用线程命名?
代码示例:
#include <SDL2/SDL.h>
// Normally I'd use #undef main
int WinMain(int, char**)
{
SDL_Init(SDL_INIT_EVERYTHING);
return 0;
}
编译:g++ gdbtest.cpp -lSDL2main -lSDL2
SDL2 版本:2.0.5(Windows 的最新版本,MinGW,32 位版本)
正常运行:a.exe
结果:程序正常启动和结束
使用 GDB 运行:Console log
结果:GDB 收到未知信号,程序崩溃
【问题讨论】:
-
没什么可做的。你能发布一些最小的代码来帮助我们理解吗?发布有关您的环境的更多信息 - 您使用的确切库、用于编译和链接的命令行参数等...
-
完成 - 代码尽可能少。