Example #1
0
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)
	}
}
Example #2
0
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)
			}
		}
	}
}