我正在用C ++编写一个游戏引擎,该引擎利用SDL来处理图形,并使用OpenAL来处理音频。我正在使用MinGW编译和GDB调试的Windows XP上进行开发。我在运行调试器时发现了问题,甚至在到达main()之前,程序都遇到了分段错误。我曾经(现在仍然)感到困惑,为什么在程序到达主程序之前会发生段错误。但是,即使GDB表示收到了SIGSEGV,该程序仍然愉快地运行,并且完全按照我的预期运行(显示的图形,播放的声音,音乐等)
当然,作为游戏引擎,有很多不同的组件,因此我摆脱了所有组件(排除了它们的编译或对其进行注释),并重新添加它们,直到发现对OpenAL的调用导致段错误。奇怪的是,该段错误仍然在before
main发生,随后注释掉OpenAL函数调用导致该段错误在下一次运行时停止发生。因此,为了检验我的假设,我用最少的代码制作了一个单独的项目,并且仅与OpenAL32和! Segfault。从字面上看,这是完整的代码:
替换alGetError()),然后发生段错误。删除alGetError(),该段错误消失。#include <al.h> int main() { alGetError(); return 0; }
我可以用任何其他OpenAL函数调用(甚至是alcOpenDevice(),它是第一个库调用designed
直接在段故障点的回溯显示以下内容:
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上进行开发。我在运行...
[main之前出现分段错误]的一个可能原因是程序错误地使用-shared