syscall.Syscall6 异常时 运行 FTP 客户端用 Go 编写

syscall.Syscall6 exception when running FTP client written in Go

我正在尝试用 Go 编写一个简单的 FTP 客户端,它将连接到 FTP 服务器,下载与特定模式 (*.xml) 匹配的任何文件,然后从服务器中删除它们。我正在使用 Go,因为它具有易于使用的交叉编译支持(对开发很重要)并生成单个静态二进制文件(对部署很重要)。 Linux 二进制文件在 Ubuntu 20.04(用于开发的主机平台)和我的 Windows 10 家用笔记本电脑(交叉编译:GOARCH=windows go build ftp-test.go)上运行良好。但是,在 Windows 10 Pro 机器上,我得到一个似乎与 DNS 解析有关的异常和堆栈跟踪(下面的完整输出)。

最简单的客户端版本如下:

package main;

import (
    "fmt"
    "time"
    "github.com/jlaffaye/ftp"
)

func main() {
    fmt.Println("Connecting to FTP server")
    _, err := ftp.Dial("ftp.mirrorservice.org:21", ftp.DialWithTimeout(60*time.Second))
    if err != nil {
        fmt.Println(err)
    }
}

完整的客户端源代码较长,但是由于调用ftp.Dial时会发生异常,以上是触发它所需的最少代码。异常几乎立即发生,在 60 秒超时发生之前。

完整的堆栈跟踪是:

.\ftp-test.exe
Connecting to FTP server
Exception 0xc0000005 0x0 0x7ffae1952fff 0x28cb44e0000
PC=0x28cb44e0000

syscall.Syscall6(0x7ffae07f4c70, 0x4, 0xc0000b60c0, 0x0, 0xc000037f18, 0xc000037e88, 0x0, 0x0, 0x0, 0x0, ...)
        /snap/go/6715/src/runtime/syscall_windows.go:201 +0xf2
syscall.GetAddrInfoW(0xc0000b60c0, 0x0, 0xc000037f18, 0xc000037e88, 0x16, 0x0)
        /snap/go/6715/src/syscall/zsyscall_windows.go:1718 +0xe5
net.(*Resolver).lookupIP.func1(0x0, 0x0, 0x0, 0x0, 0x0)
        /snap/go/6715/src/net/lookup_windows.go:109 +0x259
net.(*Resolver).lookupIP.func2(0xc0000985c0, 0xc0000e8120)
        /snap/go/6715/src/net/lookup_windows.go:146 +0x32
created by net.(*Resolver).lookupIP
        /snap/go/6715/src/net/lookup_windows.go:145 +0x41b

goroutine 1 [select]:
net.(*Resolver).lookupIPAddr(0x5268e0, 0x41e1e0, 0xc0000e8000, 0x3dbef9, 0x3, 0x3e146f, 0x15, 0x15, 0x0, 0x0, ...)
        /snap/go/6715/src/net/lookup.go:299 +0x685
net.(*Resolver).internetAddrList(0x5268e0, 0x41e1e0, 0xc0000e8000, 0x3dbef9, 0x3, 0x3e146f, 0x18, 0x0, 0x0, 0x0, ...)
        /snap/go/6715/src/net/ipsock.go:280 +0x4d4
net.(*Resolver).resolveAddrList(0x5268e0, 0x41e1e0, 0xc0000e8000, 0x3dc010, 0x4, 0x3dbef9, 0x3, 0x3e146f, 0x18, 0x0, ...)
        /snap/go/6715/src/net/dial.go:221 +0x49d
net.(*Dialer).DialContext(0xc0000e6010, 0x41e1a0, 0xc0000a2058, 0x3dbef9, 0x3, 0x3e146f, 0x18, 0x0, 0x0, 0x0, ...)
        /snap/go/6715/src/net/dial.go:403 +0x23c
github.com/jlaffaye/ftp.Dial(0x3e146f, 0x18, 0xc0000cbf50, 0x1, 0x1, 0x19, 0x0, 0x0)
        /home/paul/go/src/github.com/jlaffaye/ftp/ftp.go:105 +0x5fc
main.main()
        /home/paul/ftp-test.go:11 +0xe5

goroutine 19 [select]:
net.(*Resolver).lookupIP(0x5268e0, 0x41e160, 0xc0000ea000, 0x3dbef9, 0x3, 0x3e146f, 0x15, 0x0, 0x0, 0x0, ...)
        /snap/go/6715/src/net/lookup_windows.go:151 +0x1b9
net.glob..func1(0x41e160, 0xc0000ea000, 0xc0000886c0, 0x3dbef9, 0x3, 0x3e146f, 0x15, 0x0, 0x0, 0x0, ...)
        /snap/go/6715/src/net/hook.go:23 +0x79
net.(*Resolver).lookupIPAddr.func1(0x0, 0x0, 0x0, 0x0)
        /snap/go/6715/src/net/lookup.go:293 +0xc2
internal/singleflight.(*Group).doCall(0x5268f0, 0xc0000d60a0, 0xc0000a0760, 0x19, 0xc0000ea040)
        /snap/go/6715/src/internal/singleflight/singleflight.go:95 +0x35
created by internal/singleflight.(*Group).DoChan
        /snap/go/6715/src/internal/singleflight/singleflight.go:88 +0x2cc
rax     0x7ffaddecd84a
rbx     0x7ffaddecd848
rcx     0x77
rdi     0xffffffffffbadd11
rsi     0x0
rbp     0x28cb45135d0
rsp     0xbc5e7fe300
r8      0x94b
r9      0x94b
r10     0x94b
r11     0x94b
r12     0x7ffae1760000
r13     0x0
r14     0x7ffaddecd84a
r15     0xc000007a
rip     0x28cb44e0000
rflags  0x10202
cs      0x33
fs      0x53
gs      0x2b

我已经试过了:

不幸的是,我对 Windows 10 Pro 机器的访问权限有限,所以我无法安装 Go 工具链(举个例子)。

我是 Go 的新手,很少将 Windows 作为平台,所以我不确定问题是否与我的代码有关,我正在为 [=64= 使用的第三方库],或 Windows(或组合)。

我的 Go 版本是:1.15.4 linux/amd64 和 1.14.7 windows/amd64

我找不到这个问题的明确答案 - 除了 Windows 防火墙外,机器上 运行 似乎没有安全软件 - 但我的软件现在已成功部署在其他地方所以我假设这是一个特定于机器的问题。