From 2c8f004ea6f49bc7ce072d3e87003f6e10dfd0e6 Mon Sep 17 00:00:00 2001 From: Joey Jiao Date: Thu, 24 Jun 2021 07:56:47 +0800 Subject: all: add /rawcoverfiles to help debug PC symbolize --- pkg/cover/html.go | 21 +++++++++++++++++++++ pkg/cover/report.go | 9 +++++++++ syz-manager/html.go | 13 +++++++++++++ 3 files changed, 43 insertions(+) diff --git a/pkg/cover/html.go b/pkg/cover/html.go index bdbd3bbf4..63b1506c1 100644 --- a/pkg/cover/html.go +++ b/pkg/cover/html.go @@ -4,6 +4,7 @@ package cover import ( + "bufio" "bytes" "encoding/csv" "fmt" @@ -12,6 +13,7 @@ import ( "io" "io/ioutil" "math" + "net/http" "path/filepath" "sort" "strconv" @@ -104,6 +106,25 @@ func (rg *ReportGenerator) DoHTML(w io.Writer, progs []Prog) error { return coverTemplate.Execute(w, d) } +func (rg *ReportGenerator) DoRawCoverFiles(w http.ResponseWriter, progs []Prog) error { + if err := rg.lazySymbolize(progs); err != nil { + return err + } + sort.Slice(rg.Frames, func(i, j int) bool { + return rg.Frames[i].PC < rg.Frames[j].PC + }) + + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + buf := bufio.NewWriter(w) + fmt.Fprintf(buf, "PC,Module,Offset,Filename,StartLine,EndLine\n") + for _, frame := range rg.Frames { + offset := frame.PC - frame.Module.Addr + fmt.Fprintf(buf, "0x%x,%v,0x%x,%v,%v\n", frame.PC, frame.Module.Name, offset, frame.Name, frame.StartLine) + } + buf.Flush() + return nil +} + type fileStats struct { Name string CoveredLines int diff --git a/pkg/cover/report.go b/pkg/cover/report.go index 8f805fe10..c7d96b703 100644 --- a/pkg/cover/report.go +++ b/pkg/cover/report.go @@ -175,6 +175,15 @@ func (rg *ReportGenerator) lazySymbolize(progs []Prog) error { return err } rg.Frames = append(rg.Frames, frames...) + uniqueFrames := make(map[uint64]bool) + var finalFrames []backend.Frame + for _, frame := range rg.Frames { + if !uniqueFrames[frame.PC] { + uniqueFrames[frame.PC] = true + finalFrames = append(finalFrames, frame) + } + } + rg.Frames = finalFrames for sym := range symbolize { sym.Symbolized = true } diff --git a/syz-manager/html.go b/syz-manager/html.go index 2b12b0a14..26b611aa1 100644 --- a/syz-manager/html.go +++ b/syz-manager/html.go @@ -49,6 +49,7 @@ func (mgr *Manager) initHTTP() { mux.HandleFunc("/file", mgr.httpFile) mux.HandleFunc("/report", mgr.httpReport) mux.HandleFunc("/rawcover", mgr.httpRawCover) + mux.HandleFunc("/rawcoverfiles", mgr.httpRawCoverFiles) mux.HandleFunc("/filterpcs", mgr.httpFilterPCs) mux.HandleFunc("/funccover", mgr.httpFuncCover) mux.HandleFunc("/filecover", mgr.httpFileCover) @@ -240,6 +241,7 @@ const ( DoHTMLTable DoCSV DoCSVFiles + DoRawCoverFiles ) func (mgr *Manager) httpCover(w http.ResponseWriter, r *http.Request) { @@ -316,6 +318,13 @@ func (mgr *Manager) httpCoverCover(w http.ResponseWriter, r *http.Request, funcF do = rg.DoCSV } else if funcFlag == DoCSVFiles { do = rg.DoCSVFiles + } else if funcFlag == DoRawCoverFiles { + if err := rg.DoRawCoverFiles(w, progs); err != nil { + http.Error(w, fmt.Sprintf("failed to generate coverage profile: %v", err), http.StatusInternalServerError) + return + } + runtime.GC() + return } if err := do(w, progs); err != nil { http.Error(w, fmt.Sprintf("failed to generate coverage profile: %v", err), http.StatusInternalServerError) @@ -487,6 +496,10 @@ func (mgr *Manager) httpRawCover(w http.ResponseWriter, r *http.Request) { buf.Flush() } +func (mgr *Manager) httpRawCoverFiles(w http.ResponseWriter, r *http.Request) { + mgr.httpCoverCover(w, r, DoRawCoverFiles, false) +} + func (mgr *Manager) httpFilterPCs(w http.ResponseWriter, r *http.Request) { if mgr.coverFilter == nil { fmt.Fprintf(w, "cover is not filtered in config.\n") -- cgit mrf-deployment