Closed. This question is not reproducible or was caused by typos。它当前不接受答案。












想要改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。

1年前关闭。



Improve this question




我已经度过了一个星期的时间,试图解决我的一个项目中的一个神秘问题,但我没有主意。

我写了一个Go包,用来播放环绕OpenAL的声音……非常基本的东西。我可以在我的Xubuntu 14.04(32位)上运行它,因此我启动了Windows(7,也是32位)以便移植它……这就是问题开始的地方。

每当我尝试使用音频包时,该程序都会因c0000005而崩溃。我试图通过gdb运行它,但惊讶地发现它可以正常工作,甚至播放了我的测试声音。

时间过去了,不知道该怎么办,我下载了OpenAL Soft源代码并开始添加printfs-发现崩溃的确切行:

http://repo.or.cz/w/openal-soft.git/blob/HEAD:/Alc/backends/dsound.c#l361

对于那些懒惰的人单击链接(或者如果链接停止工作),则是对DirectSoundCreate的调用。再次运行调试器,在调用之前和之后,我都看到了打印件,并且在它们之间创建了4个新线程。

这些是Go文件中的相关内容:
package audio

/*
#cgo CFLAGS: -I"../libraries/include"

#cgo windows,386 LDFLAGS: ../libraries/lib/windows/x86/OpenAL32.dll
#cgo windows,amd64 LDFLAGS: ../libraries/lib/windows/x64/OpenAL32.dll
#cgo linux LDFLAGS: -lopenal

#include "audio.h"
*/
import "C"
import (
    "errors"
)

var context *C.ALCcontext

func Init() error {
    context = C.initAudio() // it crashes on this line
    if context == nil {
        return errors.New("could not initialize audio")
    }

    SetActiveListener(NewListener())

    return nil
}

这是实际执行OpenAL调用的C文件:
#include "audio.h"

#include <string.h>
#include <stdio.h>

ALCcontext* initAudio() {
    ALCdevice* device = alcOpenDevice(NULL); // crashes here
    if (device == NULL) {
        return NULL;
    }

    ALCcontext* context = alcCreateContext(device, NULL);
    if (!alcMakeContextCurrent(context)) {
        return NULL;
    }

    return context;
}

最后但并非最不重要的一点是,如果我在纯C语言中执行完全相同的操作(实际上只是将main添加到我发布的文件中,然后调用initAudio),则它可以工作。

我的问题很明显:#@!$发生了什么?

编辑:

其他一些值得一提的事情:

我创建了一个与上一个项目完全分开的新项目,其中有我之前发布的两个文件(显然,Go文件中的链接器具有不同的路径)和仅执行一件事的主Go文件:调用audio.Init。不管我尝试哪个dll(我尝试了http://openal.org的“官方”版本,OpenAL Soft的预编译版本,以及我自己编译的两个版本,一个使用MinGW,一个使用Visual Studio),其行为都相同。我还尝试在runtime.LockOSThread的开头调用audio.Init,但这没有帮助。

另外,我将编译后的程序发送给了我的两个 friend ,一个运行Windows 8,另一个运行Windows 7(均为64位)。装有Windows 8的计算机表示可以运行,装有Windows 8的计算机则表示已崩溃。但是,如果我们尝试使用64位工具链从后一台机器上的源代码对其进行编译,则它可以工作。

编辑#2:

我只是尝试再次从源代码编译OpenAL Soft-首先使用Visual Studio,然后使用MinGW,然后将我前面提到的独立项目与库文件(VS中的OpenAL32.lib和MinGW中的libOpenAL32.dll.a)链接起来直接将DLL(因为那是...我猜是更正确的方法吗?)

VS的结果:

链接期间失败,并显示以下消息:
# command-line-arguments
C:\Users\Milan\AppData\Local\Temp\go-build078751523/audiot/audio.a(_all.o): malf
ormed pe file: unexpected flags 0xe0500020 for PE section .text
audiot/audio._Cfunc_initAudio: undefined: _cgo_e0a3be4f138e_Cfunc_initAudio

MinGW的结果:

它成功编译并运行,尽管它不能防止崩溃,但至少可以打印出一些东西:
fatal error: unexpected signal during runtime execution
[signal 0xc0000005 code=0x1 addr=0x420f85 pc=0x42874c]

runtime stack:
invalid spdelta 96655 -1
runtime: unexpected return pc for _cgo_ec587e40eeca_Cfunc_initAudio called from
0x42874800
runtime.throw(0x455dc0)
        c:/go/src/pkg/runtime/panic.c:520 +0x71
runtime.sigpanic()
        c:/go/src/pkg/runtime/os_windows.c:352 +0x46
invalid spdelta 96655 -1
runtime: unexpected return pc for _cgo_ec587e40eeca_Cfunc_initAudio called from
0x42874800
_cgo_ec587e40eeca_Cfunc_initAudio()
        ?:0 +0xc

goroutine 16 [syscall]:
runtime.cgocall(0x428740, 0x533f64)
        c:/go/src/pkg/runtime/cgocall.c:143 +0xed fp=0x533f58 sp=0x533f2c
audiot/audio._Cfunc_initAudio(0x42e340)
        audiot/audio/_obj/_cgo_defun.c:53 +0x37 fp=0x533f64 sp=0x533f58
audiot/audio.Init(0x0, 0x0)
        C:/Users/Milan/Desktop/Dropbox/Projekty/Go/src/audiot/audio/at.go:23 +0x
3c fp=0x533f90 sp=0x533f64
main.main()
        c:/Users/Milan/Desktop/Dropbox/Projekty/Go/src/audiot/main.go:10 +0x29 f
p=0x533f9c sp=0x533f90
runtime.main()
        c:/go/src/pkg/runtime/proc.c:247 +0x11e fp=0x533fd0 sp=0x533f9c
runtime.goexit()
        c:/go/src/pkg/runtime/proc.c:1445 fp=0x533fd4 sp=0x533fd0
created by _rt0_go
        c:/go/src/pkg/runtime/asm_386.s:101 +0x102

goroutine 17 [syscall]:
runtime.goexit()
        c:/go/src/pkg/runtime/proc.c:1445
exit status 2

我还认为发布工具链的细节不会有什么坏处:
$ gcc --version
gcc.exe (GCC) 4.8.1
Copyright (C) 2013 Free Software Foundation, Inc.

$ go version
go version go1.3 windows/386

而且,不要忘了Visual Studio 2013 Express

最佳答案

我刚刚了解到Go 1.3.1出现了,所以我尝试进行更新...,然后问题消失了。 (啊!)

我猜那是一个编译器错误。无论如何,感谢所有尝试提供帮助的人,我对此深表感谢。

关于Go,OpenAL,DirectSound和Heisenbug,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25329163/

10-13 05:36