Robert, Tracing is not possible, there will be trillions of instructions logged at the instruction level tracing.
Let me elaborate a bit more. The kind of tool I am thinking, intercepts every instruction being executed on all OS threads in the go process. The issue is that when an "interesting event" has been detected by my tool, I need to record the calling context, that is main()->func1()->func2(). The call stack unwinding is too expensive in my case since the "interesting events" happen too frequently. But it is much easier to maintain a running per-go-routime shadow stack by tracking call-ret sequences as it is executing on an OS thread. Since, the go scheduler switches from one go routine stack to another, I need to do the following things (in addition to the call-ret tracking): 1. Precisely recognize the stack switch event by the current thread. Let the current go stack be S1. 2. Save the shadow stack S1_shadow (analogous to the save sequence in the gosave routine) in metadata. 3. Precisely identify the other stack S2 the scheduler is switching to. 4. Search for S2_shadow in the metadata and switch to it (analogous to the restore sequence in the gogo routine). -Milind On Sat, Feb 9, 2019 at 5:39 PM robert engels <reng...@ix.netcom.com> wrote: > Milind, > > Understood. A few things to think about: 1) the tracing seems pretty > efficient in my tests, although if you don’t want a custom runtime, you’ll > need to post analyze on the file. 2) I think you are going to have a hard > time doing what you are trying to do because of the shared threads, you > won’t have an idea of what is being executed just by recording the place of > the context switch - you’ll need to inspect the associated ‘current g’ > structure, which can be different based on the compiled version of Go. > > It is a similar problem faced even by pprof. Since it only records ‘time > in function’ and isn’t reported by Go routine, just the combined process, a > Go routine that locks and OS thread and calls a system call that pauses, > looks on the outside as being expensive… when in reality it is not doing > anything. > > On Feb 9, 2019, at 7:07 PM, Milind Chabbi <milis...@gmail.com> wrote: > > Ian, > > Can you give me more details about these terms: "g0", "systemstack", and > "mcall"? > > Robert: taking the trace route is incorrect for me; I am profiling, > tracing is too expensive because of logging, furthermore, I don't want to > recompile the application or change the go runtime. > > -Milind > > On Sat, Feb 9, 2019 at 2:34 PM Ian Lance Taylor <i...@golang.org> wrote: > >> 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. > > > -- 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.