Build tags are part of the conditional compilation system provided by the go tool. This is a quick post to discuss using build tags to selectively enable debug printing in a package.

This afternoon I merged a contribution to pkg/sftp which improved the packet encoding performance but introduced a bug where some packet types were incorrectly encoded.

% go test -integration Unknown message 0 ... oops

Turning on verbose got a little closer.

% go test -integration -v === RUN TestUnmarshalAttrs --- PASS: TestUnmarshalAttrs (0.00s) === RUN TestNewClient --- PASS: TestNewClient (0.00s) === RUN TestClientLstat Unknown message 0

But each integration test sends many different packets, which one was at fault?

Rather than reaching for fmt.Println I took a few minutes to add conditional debugging to this package.

debug.go

// +build debug package sftp import "log" func debug(fmt string, args ...interface{}) { log.Printf(fmt, args...) }

release.go

// +build !debug package sftp func debug(fmt string, args ...interface{}) {}

Adding a call to debug inside sendPacket it was easy to figure out the packet which was being incorrectly encoded.

% go test -tags debug -integration -v -run=Lstat 2014/09/28 11:18:31 send packet sftp.sshFxInitPacket, len: 38 === RUN TestClientLstat 2014/09/28 11:18:31 send packet sftp.sshFxInitPacket, len: 5 2014/09/28 11:18:31 send packet sftp.sshFxpLstatPacket, len: 62 Unknown message 0

Debugging is optional

When I committed the fix for this bug I didn’t have to spend any time removing the debug function calls inside the package.

When -tags debug is not present, the version from release.go , effectively a no-op, is used.

Extra credit