代码之家  ›  专栏  ›  技术社区  ›  greatwolf Romowski

我从源代码构建的SDL库崩溃了!

  •  1
  • greatwolf Romowski  · 技术社区  · 15 年前

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

    只是为了补充一些信息,使用了SDL-1.2.14。该项目被编译为启用多线程的dll,并动态链接到C运行时。我还用调试信息重建了它。当我一步一步地调试到崩溃点时,它似乎来自sdlmain中的redirect\u stdout。如果我移除sdlmain.lib 在sdl测试项目中直接使用源文件sdl\u win32\u main.c,这样就不会崩溃了。相反,它只是在稍后的SDL\u Init例程中崩溃。

    我已经检查了使用的调用约定,它们似乎都是匹配的——所有的东西都在使用cdecl。我也检查了一下sdl.dll 测试应用程序使用相同的动态c运行时,而不是静态链接。

    Borland部分下的sdlwiki提到使用-b来确保enum的大小与int相同,但是除非显式关闭,否则默认情况下编译器会启用该选项。不过,我确实用编译器/链接器开关重建了SDL。

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

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

    在调用SDL\ u 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
    

    我不知道在这一点上该怎么做,因为我很难堪。如果有人有任何建议或需要我提供更多的信息,请随时添加到评论。

    谢谢

    1 回复  |  直到 11 年前
        1
  •  3
  •   greatwolf Romowski    15 年前

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

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

    推荐文章