github.com/google/syzkaller@v0.0.0-20251211124644-a066d2bc4b02/tools/syz-symbolize/symbolize.go (about) 1 // Copyright 2016 syzkaller project authors. All rights reserved. 2 // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. 3 4 package main 5 6 import ( 7 "flag" 8 "fmt" 9 "os" 10 "path/filepath" 11 "runtime" 12 13 "github.com/google/syzkaller/pkg/hash" 14 "github.com/google/syzkaller/pkg/mgrconfig" 15 "github.com/google/syzkaller/pkg/osutil" 16 "github.com/google/syzkaller/pkg/report" 17 "github.com/google/syzkaller/pkg/tool" 18 "github.com/google/syzkaller/pkg/vcs" 19 ) 20 21 var ( 22 flagOS = flag.String("os", runtime.GOOS, "target os") 23 flagArch = flag.String("arch", runtime.GOARCH, "target arch") 24 flagKernelObj = flag.String("kernel_obj", ".", "path to kernel build/obj dir") 25 flagKernelSrc = flag.String("kernel_src", "", "path to kernel sources (defaults to kernel_obj)") 26 flagOutDir = flag.String("outdir", "", "output directory") 27 flagConfig = flag.String("config", "", "optional configuration file") 28 ) 29 30 func main() { 31 flag.Parse() 32 if len(flag.Args()) != 1 { 33 fmt.Fprintf(os.Stderr, "usage: syz-symbolize [flags] kernel_log_file\n") 34 flag.PrintDefaults() 35 os.Exit(1) 36 } 37 var err error 38 cfg := &mgrconfig.Config{} 39 if *flagConfig != "" { 40 cfg, err = mgrconfig.LoadPartialFile(*flagConfig) 41 } else { 42 cfg, err = mgrconfig.LoadPartialData([]byte(`{ 43 "kernel_obj": "` + *flagKernelObj + `", 44 "kernel_src": "` + *flagKernelSrc + `", 45 "target": "` + *flagOS + "/" + *flagArch + `" 46 }`)) 47 } 48 if err != nil { 49 tool.Fail(err) 50 } 51 cfg.CompleteKernelDirs() 52 reporter, err := report.NewReporter(cfg) 53 if err != nil { 54 tool.Failf("failed to create reporter: %v", err) 55 } 56 text, err := os.ReadFile(flag.Args()[0]) 57 if err != nil { 58 tool.Failf("failed to open input file: %v", err) 59 } 60 reps := report.ParseAll(reporter, text) 61 if len(reps) == 0 { 62 rep := &report.Report{Report: text} 63 if err := reporter.Symbolize(rep); err != nil { 64 tool.Failf("failed to symbolize report: %v", err) 65 } 66 os.Stdout.Write(rep.Report) 67 return 68 } 69 for _, rep := range reps { 70 if *flagOutDir != "" { 71 saveCrash(rep, *flagOutDir) 72 } 73 if err := reporter.Symbolize(rep); err != nil { 74 fmt.Fprintf(os.Stderr, "failed to symbolize report: %v\n", err) 75 } 76 fmt.Printf("TITLE: %v\n", rep.Title) 77 fmt.Printf("CORRUPTED: %v (%v)\n", rep.Corrupted, rep.CorruptedReason) 78 fmt.Printf("SUPPRESSED: %v\n", rep.Suppressed) 79 fmt.Printf("MAINTAINERS (TO): %v\n", rep.Recipients.GetEmails(vcs.To)) 80 fmt.Printf("MAINTAINERS (CC): %v\n", rep.Recipients.GetEmails(vcs.Cc)) 81 fmt.Printf("\n") 82 os.Stdout.Write(rep.Report) 83 fmt.Printf("\n\n") 84 } 85 } 86 87 func saveCrash(rep *report.Report, path string) { 88 sig := hash.Hash([]byte(rep.Title)) 89 id := sig.String() 90 dir := filepath.Join(path, id) 91 osutil.MkdirAll(dir) 92 if err := osutil.WriteFile(filepath.Join(dir, "description"), []byte(rep.Title+"\n")); err != nil { 93 tool.Failf("failed to write description: %v", err) 94 } 95 96 if err := osutil.WriteFile(filepath.Join(dir, "log"), rep.Output); err != nil { 97 tool.Failf("failed to write log: %v", err) 98 } 99 100 if len(rep.Report) > 0 { 101 if err := osutil.WriteFile(filepath.Join(dir, "report"), rep.Report); err != nil { 102 tool.Failf("failed to write report: %v", err) 103 } 104 } 105 }