为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕妹3242003 2021-09-10 15:39:23
在什么情况下 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 0x3235ce40PC=0x3235ce40signal arrived during cgo execution.../sweph.swe_jdut1_to_utc(0x40000000, 0x4150b979, 0x1, 0x1207bf24, 0x1207bf28, 0x1207bf34, 0x1207bf30, 0x1207bf2c, 0x1207bf38)...(trace info)eax     0x0ebx     0x1207be94ecx     0x1207bf38edx     0x42e5e5edi     0xcfeacesi     0x0ebp     0xcfe5cesp     0xcfdd8eip     0x3235ce40eflags  0x10246cs      0x23fs      0x53gs      0x2bexit status 2exit status 1环境:Windows 8 x64go 1.4    x86gcc       x86而且我不知道是否gcc真的需要只调用一个 dll,但我已经以任何方式安装了它,因为错误是关于cgo. 所有命令都在路径中。使用管理权限编译时出现同样的错误。
查看完整描述

1 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

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



查看完整回答
反对 回复 2021-09-10
  • 1 回答
  • 0 关注
  • 407 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信