  Golang (also known as Go for short) has become popular in building
concurrency programs in distributed systems. As the unique features, Go employs
lightweight Goroutines to support highly parallelism in user space. Moreover,
Go leverages channels to enable explicit communication among threads. However,
recent studies show that concurrency bugs are not uncommon in Go applications.
Pinpointing these concurrency bugs in real Go applications is both important
and challenging. Existing approaches are mostly based on compiler-aided static
or dynamic analysis, which have two limitations. First, existing approaches
require the availability and recompilation of the source code, which work well
on testing rather than production environments with no source code available
for both applications and external libraries. Second, existing approaches work
on pure Go code bases only, not programs mixed with Go and other languages. To
address these limitations, we develop BinGo, the first tool to identify
concurrency bugs in Go applications via dynamic binary analysis. BinGo
correlates binary execution with Go semantics and employs novel bug detection
algorithms. BinGo is an end-to-end tool that is ready for deployment in the
production environment with no modification on source code, compilers, and
runtimes in the Go eco-system. Our experiments show that BinGo has a high
coverage of concurrency bugs with no false positives. We are able to use BinGo
to identify concurrency bugs in real applications with moderate overhead.
