MainAL之前的OpenAL分段故障>>

问题描述 投票:3回答:1

我正在用C ++编写一个游戏引擎,该引擎利用SDL来处理图形,并使用OpenAL来处理音频。我正在使用MinGW编译和GDB调试的Windows XP上进行开发。我在运行调试器时发现了问题,甚至在到达main()之前,程序都遇到了分段错误。我曾经(现在仍然)感到困惑,为什么在程序到达主程序之前会发生段错误。但是,即使GDB表示收到了SIGSEGV,该程序仍然愉快地运行,并且完全按照我的预期运行(显示的图形,播放的声音,音乐等)

当然,作为游戏引擎,有很多不同的组件,因此我摆脱了所有组件(排除了它们的编译或对其进行注释),并重新添加它们,直到发现对OpenAL的调用导致段错误。奇怪的是,该段错误仍然在before

main发生,随后注释掉OpenAL函数调用导致该段错误在下一次运行时停止发生。

因此,为了检验我的假设,我用最少的代码制作了一个单独的项目,并且仅与OpenAL32和! Segfault。从字面上看,这是完整的代码:

#include <al.h>

int main()
{
    alGetError();
    return 0;
}

我可以用任何其他OpenAL函数调用(甚至是alcOpenDevice(),它是第一个库调用designed

替换alGetError()),然后发生段错误。删除alGetError(),该段错误消失。

直接在段故障点的回溯显示以下内容:

    Program received signal SIGSEGV, Segmentation fault.
0x7c918af2 in ntdll!RtlpWaitForCriticalSection ()
   from C:\WINDOWS\system32\ntdll.dll
(gdb) bt
#0  0x7c918af2 in ntdll!RtlpWaitForCriticalSection ()
   from C:\WINDOWS\system32\ntdll.dll
#1  0x7c901046 in ntdll!RtlEnumerateGenericTableLikeADirectory ()
   from C:\WINDOWS\system32\ntdll.dll
#2  0x00e461a0 in ?? ()
#3  0x77dd6cd8 in RegCloseKey () from C:\WINDOWS\system32\advapi32.dll
#4  0x77dde88d in RegCreateKeyExA () from C:\WINDOWS\system32\advapi32.dll
#5  0x77de473f in RegCreateKeyA () from C:\WINDOWS\system32\advapi32.dll
#6  0x6650127a in ?? () from C:\WINDOWS\system32\wbsys.dll
#7  0x7c90118a in ntdll!LdrSetAppCompatDllRedirectionCallback ()
   from C:\WINDOWS\system32\ntdll.dll
#8  0x66500000 in ?? ()
#9  0x7c91c342 in ntdll!LdrHotPatchRoutine ()
   from C:\WINDOWS\system32\ntdll.dll
#10 0x7c915c69 in ntdll!RtlValidateUnicodeString ()
   from C:\WINDOWS\system32\ntdll.dll
#11 0x7c915dcb in ntdll!LdrShutdownProcess ()
   from C:\WINDOWS\system32\ntdll.dll
#12 0x00000000 in ?? ()

RtlpWaitForCriticalSection()使它看起来像是一个线程问题,如果我没有记错的话,OpenAL在单独的线程中运行。但是,我对多线程编程不太熟悉。

我在Linux下编译了我的项目(整个游戏引擎,处于当前状态),没有segfault消息发生,并且程序按我期望的方式运行(这意味着我还有其他一些错误/ segfaults来解决,但我对它们有帮助:P)。

我不确定我的问题是什么。我想我会留一个问题:我收到的段错误信号是我实现/链接OpenAL的方式的结果,还是OpenAL库导致了超出我控制范围的事情?考虑到库的广泛用户群,我认为OpenAL本身不是问题,但谁知道。我将我的C ++项目链接到C库这一事实可能是一个问题?

UPDATE

:我已经研究了几天,但是我对此感到非常沮丧。我只能在“ Segfault在main之前”找到的唯一结果是:“您有一个静态构造函数,在main之前被调用”和“哦,它实际上不在main之前。我需要学习如何使用调试器。”

嗯,我从没听说过C ++中的静态构造函数。而且无论如何,我没有任何类就重现了错误。而且我只在使用调试器时才遇到segfault信号,因为如果程序仅通过信号爆破(又称连续),程序就会完美运行。在main或什至在main()的第一条指令上放置一个断点,该段错误会在命中该断点之前发生。

我正在用C ++编写一个游戏引擎,该引擎利用SDL来处理图形,并使用OpenAL来处理音频。我正在使用MinGW编译和GDB调试的Windows XP上进行开发。我在运行...

c++ segmentation-fault openal
1个回答
0
投票

[main之前出现分段错误]的一个可能原因是程序错误地使用-shared

© www.soinside.com 2019 - 2024. All rights reserved.