I ran into this same problem, and found this post!
It looks like you're making the same simple mistake I was:

# erroneous:
defer f.Close()
defer trace.Stop()

You must stop the trace *before* closing the output file.

# corrected:
defer func() {
  trace.Stop()
  panic(f.Close()) # Be sure to handle file-closing errors. They're 
important!!
}

On Tuesday, October 11, 2016 at 8:21:17 AM UTC-6, xavier zebier wrote:
>
> Hello,
> I m trying to use the go tool trace. My code is 
>
>
> package main
>
> import (
> "flag"
> "fmt"
> "math"
> "net/http"
> "os"
> "runtime"
> "runtime/trace"
> "time"
> )
>
> func indexHandler(w http.ResponseWriter, r *http.Request) {
> primesInRangeParallel(10, 64)
> fmt.Fprintf(w, "hello world, I'm running on %s with an %s CPU ", 
> runtime.GOOS, runtime.GOARCH)
>
> }
>
> func main() {
> flag.Parse()
> f, errs := os.Create(time.Now().Format("2006-01-02T150405.out"))
> if errs != nil {
> panic(errs)
> }
>
> if err := trace.Start(f); err != nil {
> panic(err)
> }
>
> defer f.Close()
> defer trace.Stop()
> http.HandleFunc("/", indexHandler)
>
> http.ListenAndServe(":8080", nil)
> }
>
> // We will use this struct to communicate results via a channel
> type PrimeResult struct {
> number int64 // A number
> prime  bool  // Is prime or not
> }
>
> /**
>  * A function to return a prime calculation over a channel. This way
>  * we don't need to have 2 versions of isPrime function, one for
>  * sequential calculations and another for paralel
>  */
>
> func isPrimeAsync(number int64, channel chan PrimeResult) {
>
> result := new(PrimeResult)
> result.number = number
> result.prime = isPrime(number)
> channel <- *result
> }
>
> /**
>  * Accepts a range of integers [min, max] and a channel and it executes
>  * in PARALEL the processes that check if a number is prime or not.
>  *
>  * This function does nothing with the result. In another point, somebody
>  * will have to read the channel and process the results
>  */
> func firePrimeCalculations(min int64, max int64, channel chan PrimeResult) 
> {
> var i int64
> for i = min; i <= max; i++ {
> go isPrimeAsync(i, channel)
> }
> }
>
> /**
>  * Accepts a range of integers [min, max] and
>  * returns an array with all the prime numbers in this range.
>  *
>  * Execution is done in paralel. First it fires all the
>  * processes that check for a prime number. These processes
>  * will write the result in a channel.
>  *
>  * We will receive the results over this channel creating the
>  * list of prime numbers and returning it
>  *
>  */
>
> func primesInRangeParallel(min int64, max int64) []int64 {
> var primeNumbers []int64
> var res PrimeResult
> var prev int64
>
> channel := make(chan PrimeResult)
> defer close(channel)
>
> go firePrimeCalculations(min, max, channel)
>
> prev = 0
> for i := min; i <= max; i++ {
> res = <-channel
> if res.prime {
> primeNumbers = append(primeNumbers, res.number)
>
> done := 100 * (i - min) / (max - min)
> if prev != done {
> fmt.Printf("%d %% done.\n", done)
> prev = done
> }
> }
> }
> return primeNumbers
> }
> func isPrime(candidate int64) bool {
> var i, limit int64
>
> if candidate == 2 {
> return true
> }
>
> if math.Mod(float64(candidate), 2) == 0 {
> return false
> }
>
> limit = int64(math.Ceil(math.Sqrt(float64(candidate))))
> for i = 3; i <= limit; i += 2 { //Only odd numbers
> if math.Mod(float64(candidate), float64(i)) == 0 {
> return false
> }
> }
> return true
> }
>
> The prime number calculation is basically there to get some calculation.
>
> My go env command gives  : 
>
> C:\repo\gonew\src\github.com\tixu\trace>go env
> set GOARCH=amd64
> set GOBIN=
> set GOEXE=.exe
> set GOHOSTARCH=amd64
> set GOHOSTOS=windows
> set GOOS=windows
> set GOPATH=c:\repo\gonew
> set GORACE=
> set GOROOT=C:\Go
> set GOTOOLDIR=C:\Go\pkg\tool\windows_amd64
> set CC=gcc
> set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0
> set CXX=g++
> set CGO_ENABLED=1
>
>
>
> And I get the following error :
>
> C:\repo\gonew\src\github.com\tixu\trace>go tool trace Trace 
> 2016-10-11T153554.out
> 2016/10/11 15:36:45 Parsing trace...
> failed to parse trace: no EvFrequency event 
>
> Can you help me .?
>
> Thanks in advance,
>
> Xavier
>

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