frontend.lisp: New `-D' option to generate stack backtrace on error.
authorMark Wooding <mdw@distorted.org.uk>
Mon, 28 Apr 2014 09:02:26 +0000 (10:02 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Mon, 28 Apr 2014 09:02:26 +0000 (10:02 +0100)
This is a frequent debugging modification, so I might as well make it
official.

The fundamental problem is that tracking down errors in a zone
description file is a complete nightmare.  This needs fixing some time.

frontend.lisp

index f957601..5a3bb7a 100644 (file)
@@ -32,6 +32,8 @@
   "Which zones to be emitted.")
 (defvar opt-format :bind
   "Which format to use on output.")
+(defvar opt-debug nil
+  "Whether to emit stack backtraces on error.")
 
 (defun directory-exists-p (name)
 
@@ -71,6 +73,8 @@
                      (#\s "subnet" (:arg "NET")
                           (list zone:*preferred-subnets*)
                           "Designate NET as a preferred subnet.")
+                     (#\D "debug" (set opt-debug)
+                          "Produce stack backtrace on error.")
                      "Output options"
                      (#\d "directory" (:arg "DIRECTORY")
                           (dir *zone-output-path*)
 
 (defun main ()
   (set-command-line-arguments)
-  (with-unix-error-reporting ()
-    (let ((files nil))
-      (unless (option-parse-try
-               (do-options ()
-                 (nil (rest)
-                   (when (zerop (length rest))
-                     (option-parse-error "no files to read"))
-                   (setf files rest))))
-       (die-usage))
-      (dolist (f files)
-       (let ((*package* (make-package "ZONE.SCRATCH"
-                                      :use '(#:common-lisp #:net #:zone))))
-         (load f :verbose nil :print nil :if-does-not-exist :error)
-         (delete-package *package*)))
-      (zone-save opt-zones :format opt-format))))
+  (let ((files nil))
+    (flet ((run ()
+            (dolist (f files)
+              (let ((*package* (make-package "ZONE.SCRATCH"
+                                             :use '(#:common-lisp
+                                                    #:net #:zone))))
+                (load f :verbose nil :print nil :if-does-not-exist :error)
+                (delete-package *package*)))
+            (zone-save opt-zones :format opt-format)))
+      (with-unix-error-reporting ()
+       (unless (option-parse-try
+                 (do-options ()
+                   (nil (rest)
+                        (when (zerop (length rest))
+                          (option-parse-error "no files to read"))
+                        (setf files rest))))
+         (die-usage)))
+      (if opt-debug
+         (run)
+         (with-unix-error-reporting () (run))))))
 
 ;;;----- That's all, folks --------------------------------------------------