I guess it depends on what you are logging/doing in response to the interesting 
event, and where/when these occur, and how you are detecting them, as the 
tracing of the context switch is very cheap. 

> On Feb 9, 2019, at 8:10 PM, Milind Chabbi <milis...@gmail.com> wrote:
> 
> 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.

-- 
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