当以下程序在启用竞态检测器的情况下运行时,它会在 ""
参数处截断命令行参数列表。特别是,这防止了在 ppc64le 上使用启用竞态检测器的 cmd/compile,因为 cmd/go 通常传递 -D ""
。我只在 linux/ppc64le 上看到这个问题。我无法在 linux/amd64 上重现这个问题。
$ go run hi.go -- one two "" three four
["/tmp/go-build2867456842/b001/exe/hi" "--" "one" "two" "" "three" "four"]
["one" "two" "" "three" "four"]
$ go run -race hi.go -- one two "" three four
["/tmp/go-build2206806436/b001/exe/hi" "--" "one" "two"]
["one" "two"]
package main
import (
"flag"
"fmt"
"os"
)
func main() {
fmt.Printf("%q\n", os.Args)
flag.Parse()
fmt.Printf("%q\n", flag.Args())
}
/cc @dvyukov
5条答案
按热度按时间ql3eal8s1#
https://golang.org/cl/286173提到了这个问题:
[dev.regabi] cmd/go: workaround -race issue on ppc64le
8yoxcaq72#
仅猜测:在某些架构中,TSAN可能会重新执行程序(例如,由于它需要特定的内存布局而禁用ASLR)。重新执行可能会消耗参数。也许您可以使用strace来查看它是否重新执行?机器上
ulimit -a
的输出是什么?jdg4fx2g3#
也许你可以使用strace来查看它是否重新执行?
这确实看起来像是罪魁祸首:
在机器上运行ulimit -a的输出是什么?
envsm3lx4#
可能是ASLR(地址空间布局随机化)的问题。你可以尝试禁用ASLR吗?
这可能是TSAN(线程本地存储抽象)中重新执行代码的错误。
0g0grzrc5#
是的,看起来像是来自TSAN绕过ASLR的工作: