On Sat, Feb 9, 2019 at 2:02 PM <
mili...@gmail.com> wrote:
>
> I am looking at fine-grained calling context collection for go lang programs (for all go routines) using binary instrumentation tools such as Intel Pin.
> In a traditional language such as C/C++ intercepting CALL/RET instructions (plus some special handling for exceptions setjmp/longjmp) suffices.
> Go makes it significantly more complicated.
>
> For Go, the scheduler can context switch from one goroutine to another (including garbage collection etc.).
> The scheduler adjusts the stack pointer and program counter during these events, which (for x86) is mostly in this file:
https://github.com/golang/go/blob/master/src/runtime/asm_amd64.s
> Is there a go runtime expert, who can authoritatively confirm whether all the go routine context switching code is captured in this file or if there are other places too?
Yes, for amd64 all the goroutine switching code is in runtime/asm_amd64.s.
> It would also be great if somebody can confirm whether saving the current go routine state into gobuf_sp, gobuf_pc, gobuf_g, gobuf_ctxt, gobuf_ret and restoring a new one and jumping to the new gobuf_pc is the standard context switching idiom? Is there use of any other idiom such as overwriting the return address of a caller on the thread stack to jump to a different context during a return from a procedure?
Yes, that is the standard idiom for switching goroutines, as seen in
the gosave, gogo, and mcall functions. Also systemstack arguably
changes goroutines, though only to the g0 of the current thread.
The runtime does overwrite the PC in order to panic from a signal
handler, in sigctxt.preparePanic, but not for goroutine switching.
As Robert Engels says, tracking traceGoStart might be useful, though
you do have to have tracing enabled.
Ian (please reply to the mailing list, not just to me; thanks)