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  }