aboutsummaryrefslogtreecommitdiff
path: root/tools/src/crashhandler/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'tools/src/crashhandler/main.go')
-rw-r--r--tools/src/crashhandler/main.go79
1 files changed, 79 insertions, 0 deletions
diff --git a/tools/src/crashhandler/main.go b/tools/src/crashhandler/main.go
new file mode 100644
index 0000000..00ce0cd
--- /dev/null
+++ b/tools/src/crashhandler/main.go
@@ -0,0 +1,79 @@
+package main
+
+import (
+ "flag"
+ "fmt"
+ "io/ioutil"
+ "os"
+ "strings"
+)
+
+type CrashDump struct {
+ Name string
+ DumpPath string
+ MetadataPath string
+}
+
+func expandHomeDir(path string) (string, error) {
+ home, err := os.UserHomeDir()
+ if err != nil {
+ return path, err
+ }
+
+ return strings.Replace(path, "~/", home, -1), nil
+}
+
+func dumps(path string) ([]CrashDump, error) {
+ files, err := ioutil.ReadDir(path)
+ if err != nil {
+ return nil, err
+ }
+
+ var crashes []CrashDump
+
+ for i, file := range files {
+ if strings.HasSuffix(file.Name(), ".dmp") {
+ if i+1 < len(files) && files[i+1].Name() == file.Name()+".txt" {
+ crashes = append(crashes, CrashDump{Name: strings.TrimSuffix(file.Name(), ".dmp"),
+ DumpPath: file.Name(), MetadataPath: files[i+1].Name()})
+ } else {
+ crashes = append(crashes, CrashDump{Name: strings.TrimSuffix(file.Name(), ".dmp"), DumpPath: file.Name()})
+ }
+ }
+ }
+
+ return crashes, nil
+}
+
+func main() {
+ helpFlag := flag.Bool("help", false, "Show help information.")
+ flag.StringVar(&dumpPath, "crashd", dumpPath, "Crash dump path")
+
+ // create crash report flags
+ crashedFlag := flag.String("c", "", "Create crash report at specified location and write any specified data into it")
+
+ flag.Parse()
+ dumpPath, _ = expandHomeDir(dumpPath)
+
+ if *helpFlag {
+ flag.PrintDefaults()
+ return
+ }
+
+ if *crashedFlag != "" {
+ fmt.Println("Creating crash dump report", *crashedFlag)
+ contents := []byte("Additional information: " + strings.Join(flag.Args(), ""))
+ ioutil.WriteFile(*crashedFlag+".txt", contents, 0644)
+ return
+ }
+
+ fmt.Printf("[%s]\n", dumpPath)
+ c, err := dumps(dumpPath)
+ if err != nil {
+ panic(err)
+ }
+ for _, d := range c {
+ fmt.Printf("\t- %s\n", d.Name)
+ }
+
+}