【问题标题】:The SDL library I built from source crashes!我从源代码构建的 SDL 库崩溃了!
【发布时间】:2014-06-10 21:33:40
【问题描述】:

我已经使用 bcc 5.5.1 从源代码成功构建了 SDL,但是任何使用它的 SDL 测试应用程序在启动时都会立即崩溃。我正在寻求有关如何解决此问题的帮助和/或指导。

只是为了填写一些信息,使用了 SDL-1.2.14。该项目编译为启用多线程并动态链接到 C 运行时的 dll。我还用调试信息重建了它。当我使用调试器逐步完成崩溃点时,它似乎来自 sdlmain 中的 redirect_stdout。如果我删除 sdlmain.lib 并直接在 SDL 测试项目中使用源文件 sdl_win32_main.c 则不会再崩溃。相反,它只是稍后在 SDL_Init 例程中崩溃。

我已经检查了使用的调用约定,它们似乎都匹配——一切都在使用 cdecl。我还检查并确保编译的 sdl.dll 和测试应用程序使用相同的动态 c 运行时而不是静态链接。

Borland 部分下的 SDL wiki 提到使用 -b 来确保 enum 的大小与 int 相同,但编译器默认启用该选项,除非明确关闭。我确实用那个编译器/链接器开关重建了 SDL 只是为了确定。

当它崩溃时,尝试写入某个地址(c000005)时总是会发生访问冲突。例如,在典型的 SDL 初始化尝试中,如下所示:

// initialize SDL video
if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
{
    printf( "Unable to init SDL: %s\n", SDL_GetError() );
    return 1;
}

调用 SDL_Init() 后,控制不会流回测试应用程序。相反,它在某个奇怪的地方崩溃,例如 ntdll.dll 中的某个地方,与 NTDLL.RtlEnterCriticalSection 有关。当我检查堆栈跟踪时,我通常会得到这样的结果:

:77982269
:0044A04C
:0043F02B
:0043F7C4
:0043EF25
SDL_CreateSemaphore(1)
SDL_CreateMutex()
SDL_CreateSemaphore(1)
SDL_CreateMutex()
SDL_CreateSemaphore(1)
SDL_CreateMutex()
SDL_CreateSemaphore(1)
SDL_CreateMutex()
SDL_CreateSemaphore(1)
SDL_CreateMutex()
SDL_CreateSemaphore(1)
SDL_CreateMutex()
SDL_CreateSemaphore(1)
//and it keeps recursing... looks like a stackover? :P

我现在不确定要尝试什么,因为我很困惑。如果有人有任何建议或需要我提供更多信息,请随时将其添加到 cmets。

谢谢

【问题讨论】:

  • 您的副本是否使用 gcc 正确构建?
  • 我没有尝试过使用 cygwin 或 mingw 之类的 gcc 端口,但我已经使用 vs2008 成功构建了它。我现在正在追踪它,看看差异在哪里。

标签: c++ c sdl borland-c++


【解决方案1】:

好吧,我终于在几天前发现了问题所在。崩溃的原因是为给定平台编译了错误的源文件。

我使用的项目文件一直在从threads\generic 编译SDL_sysmutex.c。在 win32 下使用的正确 SDL_sysmutex.c 应该来自threads\win32。当我并排跟踪测试程序并且线程模块有不同的代码行时,我发现了这一点!

修复了这个小小的疏忽后,崩溃问题几乎消失了,所有测试演示都在正常运行:)

【讨论】:

    猜你喜欢
    • 2022-10-06
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多