func main() { var err error log.SetPrefix("dump: ") log.SetFlags(0) flag.Usage = func() { fmt.Fprintf(os.Stderr, "usage: dump memtrace [low [hi]]\n") os.Exit(2) } flag.Parse() if flag.NArg() < 1 || flag.NArg() > 3 { flag.Usage() } memtraceName := flag.Arg(0) low, hi := 0, int(^uint(0)>>1) if flag.NArg() >= 2 { lowStr := flag.Arg(1) low, err = strconv.Atoi(lowStr) if err != nil { flag.Usage() } } if flag.NArg() >= 3 { hiStr := flag.Arg(2) hi, err = strconv.Atoi(hiStr) if err != nil { flag.Usage() } } traceFile, err := os.Open(memtraceName) if err != nil { log.Fatal(err) } defer traceFile.Close() trace := memtrace.NewTrace(traceFile) if err := trace.Seek(low); err != nil { log.Fatal(err) } var recs [1]memtrace.Record for i := 0; i <= hi-low; i++ { if _, err := trace.ReadRecords(recs[:]); err != nil { if err == io.EOF { break } log.Fatal(err) } fmt.Printf("%#x %#x @%d\n", recs[0].PC, recs[0].EA, recs[0].N) } }
func main() { log.SetPrefix("pcs: ") log.SetFlags(0) flag.Usage = func() { fmt.Fprintf(os.Stderr, "usage: pcs memtrace ea\n") os.Exit(2) } flag.Parse() if flag.NArg() != 2 { flag.Usage() } memtraceName, eaStr := flag.Arg(0), flag.Arg(1) ea, err := strconv.ParseUint(eaStr, 0, 64) if err != nil { flag.Usage() } traceFile, err := os.Open(memtraceName) if err != nil { log.Fatal(err) } defer traceFile.Close() trace := memtrace.NewTrace(traceFile) var recs [1024]memtrace.Record for { if _, err := trace.ReadRecords(recs[:]); err != nil { if err == io.EOF { break } log.Fatal(err) } for _, rec := range recs { if rec.EA == ea { fmt.Printf("%#x @%d\n", rec.PC, rec.N) } } } }