// am-dbg is a lightweight, multi-client debugger for asyncmachine-go.
package main import ( amtele amhelp ss ) func main() { var types.Params := arg.MustParse(&) , := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer () if := cliRun(, ); != nil { .Fail(.Error()) } } func cliRun( context.Context, types.Params) error { // print the version := utils.GetVersion() if .PrintVersion { println() return nil } // logger and profiler .DbgLogger = types.GetLogger(&, .OutputDir) types.StartCpuProfileSrv(, .DbgLogger, &) := types.StartCpuProfile(.DbgLogger, &) if != nil { defer () } log.SetOutput(.DbgLogger.Writer()) // init the debugger , := debugger.New(, ) if != nil { return } // rpc client if .DebugAddr != "" { _ = amhelp.MachDebug(.Mach, .DebugAddr, .LogLevel, false, amhelp.SemConfigEnv(true)) } if .DbgOtel { .Mach.SemLogger().EnableSteps(true) os.Setenv(amtele.EnvService, "dbg") os.Setenv(amtele.EnvOtelTrace, "1") os.Setenv(amtele.EnvOtelTraceTxs, "1") os.Setenv(amtele.EnvOtelTraceArgs, "1") // AM_OTEL_TRACE_ALLOW_STATES=ClientSelected,SelectingClient,RemoveClient, // BuildingLog,LogBuilt // AM_OTEL_TRACE_ALLOW_STATES_RE=^Diagrams // os.Setenv(amtele.EnvOtelTraceAllowStates, // "ClientSelected,SelectingClient,RemoveClient,BuildingLog,LogBuilt") // os.Setenv(amtele.EnvOtelTraceAllowStatesRe, "^Diagrams") if := amtele.MachBindOtelEnv(.Mach); != nil { return } } // rpc server if .ListenAddr != "-1" { go server.StartRpc(.Mach, .ListenAddr, nil, ) } // start and wait till the end .Start() select { case <-.Mach.WhenDisposed(): case <-.Mach.WhenNot1(ss.Start, nil): } // show footer stats printStats() // pprof memory profile types.HandleProfMem(.DbgLogger, &) return nil } func printStats( *debugger.Debugger) { := 0 for , := range .Clients { += len(.MsgTxs) } _, _ = .P.Printf("Clients: %d\n", len(.Clients)) _, _ = .P.Printf("Transitions: %d\n", ) _, _ = .P.Printf("Memory: %dmb\n", debugger.AllocMem()/1024/1024) }