猿问

Go异常“信号在cgo执行期间到达”

在什么情况下 Go 会在调用dll时出现“信号在 cgo 执行期间到达”之类的恐慌?


要调用的代码是 - 基于zsyscall_windows.goin srcof go 分布中的样本:


var (

    // entry names found using dumpbin /exports

    dllSweph = syscall.NewLazyDLL("swedll32.dll")


    _swe_jdut1_to_utc = dllSweph.NewProc("_swe_jdut1_to_utc@36")

    _swe_julday       = dllSweph.NewProc("_swe_julday@24")

)


func swe_julday(year, month, day int32, hour float64, gregflag int32) float64 {

    r, _, errn := syscall.Syscall6(

        _swe_julday.Addr(),

        5,

        uintptr(year),

        uintptr(month),

        uintptr(day),

        uintptr(hour),

        uintptr(gregflag),

        0)


    if r == 0 {

        if errn != 0 {

            panic(error(errn))

        }

    }


    return float64(r)

}


func swe_jdut1_to_utc(tjd_ut float64, gregflag int32, iyear, imonth, iday, ihour, imin *int32, dsec *float64) {

    defer func() {

        if e := recover(); e != nil {

        }

    }()


    syscall.Syscall9(

        _swe_jdut1_to_utc.Addr(),

        8,

        uintptr(tjd_ut),

        uintptr(gregflag),

        uintptr(unsafe.Pointer(iyear)),

        uintptr(unsafe.Pointer(imonth)),

        uintptr(unsafe.Pointer(iday)),

        uintptr(unsafe.Pointer(ihour)),

        uintptr(unsafe.Pointer(imin)),

        uintptr(unsafe.Pointer(dsec)),

        0)

}

现在当我打电话时swe_julday一切似乎都很好;虽然它不是,它给出了错误的答案。当swe_jdut1_to_utc被调用时,我得到:


Exception 0xc0000005 0x1 0x42e5e5 0x3235ce40

PC=0x3235ce40

signal arrived during cgo execution


.../sweph.swe_jdut1_to_utc(0x40000000, 0x4150b979, 0x1, 0x1207bf24, 0x1207bf28, 0x1207bf34, 0x1207bf30, 0x1207bf2c, 0x1207bf38)

...(trace info)


eax     0x0

ebx     0x1207be94

ecx     0x1207bf38

edx     0x42e5e5

edi     0xcfeac

esi     0x0

ebp     0xcfe5c

esp     0xcfdd8

eip     0x3235ce40

eflags  0x10246

cs      0x23

fs      0x53

gs      0x2b

exit status 2


exit status 1

环境:


Windows 8 x64

go 1.4    x86

gcc       x86

而且我不知道是否gcc真的需要只调用一个 dll,但我已经以任何方式安装了它,因为错误是关于cgo. 所有命令都在路径中。使用管理权限编译时出现同样的错误。

慕妹3242003
浏览 408回答 1
1回答

拉风的咖菲猫

我设法构建了使用 swe_julday 函数的 delphi 应用程序。不幸的是,我可以看到它使用 fstp asm 指令来检索 swe_julday 返回的结果。Go 的 syscall.Syscall 不支持此功能。你是我们的幸运儿。如果可以使用 mingw 编译器构建您的库,我认为您最好的选择是使用 CGO。对不起
随时随地看视频慕课网APP

相关分类

Go
我要回答