aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoey Jiao <joeyjiaojg@gmail.com>2021-06-24 07:56:47 +0800
committerDmitry Vyukov <dvyukov@google.com>2021-06-24 10:41:44 +0200
commit2c8f004ea6f49bc7ce072d3e87003f6e10dfd0e6 (patch)
tree97ebeacd8cfc2071cbd3f09dd153990db9a2a865
parentec865f6ae70b0902cc21368ce14424446bc0bd60 (diff)
all: add /rawcoverfiles to help debug PC symbolize
-rw-r--r--pkg/cover/html.go21
-rw-r--r--pkg/cover/report.go9
-rw-r--r--syz-manager/html.go13
3 files changed, 43 insertions, 0 deletions
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")