// symbolize attempts to symbolize profile p. // If the source is a local binary, it tries using symbolizer and obj. // If the source is a URL, it fetches symbol information using symbolz. func symbolize(mode, source string, p *profile.Profile, obj plugin.ObjTool, ui plugin.UI) error { remote, local := true, true for _, o := range strings.Split(strings.ToLower(mode), ":") { switch o { case "none", "no": return nil case "local": remote, local = false, true case "remote": remote, local = true, false default: ui.PrintErr("ignoring unrecognized symbolization option: " + mode) ui.PrintErr("expecting -symbolize=[local|remote|none][:force]") fallthrough case "", "force": // Ignore these options, -force is recognized by symbolizer.Symbolize } } var err error if local { // Symbolize using binutils. if err = symbolizer.Symbolize(mode, p, obj, ui); err == nil { return nil } } if remote { err = symbolz.Symbolize(source, fetch.PostURL, p) } return err }
// symbolize attempts to symbolize profile p. // If the source is a local binary, it tries using symbolizer and obj. // If the source is a URL, it fetches symbol information using symbolz. func symbolize(mode, source string, p *profile.Profile, obj plugin.ObjTool, ui plugin.UI) error { remote, local := true, true for _, o := range strings.Split(strings.ToLower(mode), ":") { switch o { case "none", "no": return nil case "local": remote, local = false, true case "remote": remote, local = true, false default: ui.PrintErr("ignoring unrecognized symbolization option: " + mode) ui.PrintErr("expecting -symbolize=[local|remote|none][:force]") fallthrough case "", "force": // -force is recognized by symbolizer.Symbolize. // If the source is remote, and the mapping file // does not exist, don't use local symbolization. if isRemote(source) { if len(p.Mapping) == 0 { local = false } else if _, err := os.Stat(p.Mapping[0].File); err != nil { local = false } } } } var err error if local { // Symbolize using binutils. if err = symbolizer.Symbolize(mode, p, obj, ui); err == nil { return nil } } if remote { err = symbolz.Symbolize(source, fetch.PostURL, p) } return err }