On Sat, Feb 9, 2019 at 2:02 PM <milis...@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)

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to