// Parse parses, post-processes and verifies the trace.
func Parse(r io.Reader, bin string) ([]*Event, error) {
- ver, rawEvents, strings, err := readTrace(r)
+ ver, events, err := parse(r, bin)
if err != nil {
return nil, err
}
+ if ver < 1007 && bin == "" {
+ return nil, fmt.Errorf("for traces produced by go 1.6 or below, the binary argument must be provided")
+ }
+ return events, nil
+}
+
+// parse parses, post-processes and verifies the trace. It returns the
+// trace version and the list of events.
+func parse(r io.Reader, bin string) (int, []*Event, error) {
+ ver, rawEvents, strings, err := readTrace(r)
+ if err != nil {
+ return 0, nil, err
+ }
events, stacks, err := parseEvents(ver, rawEvents, strings)
if err != nil {
- return nil, err
+ return 0, nil, err
}
events, err = removeFutile(events)
if err != nil {
- return nil, err
+ return 0, nil, err
}
err = postProcessTrace(ver, events)
if err != nil {
- return nil, err
+ return 0, nil, err
}
// Attach stack traces.
for _, ev := range events {
}
if ver < 1007 && bin != "" {
if err := symbolize(events, bin); err != nil {
- return nil, err
+ return 0, nil, err
}
}
- return events, nil
+ return ver, events, nil
}
// rawEvent is a helper type used during parsing.
if err != nil {
t.Fatalf("failed to read input file: %v", err)
}
- _, err = Parse(bytes.NewReader(data), "")
+ // Instead of Parse that requires a proper binary name for old traces,
+ // we use 'parse' that omits symbol lookup if an empty string is given.
+ _, _, err = parse(bytes.NewReader(data), "")
switch {
case strings.HasSuffix(f.Name(), "_good"):
if err != nil {