This is the mail archive of the guile@cygnus.com mailing list for the guile project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
i'm having trouble trapping errors and displaying a backtrace during a callout from a c program. i have some code kindly provided by marious vollmer that seems to work, but sometimes my program dies with a SIGSEGV during printing of the backtrace. here is the function i am using: (define (call-with-error-catching thunk) (let ((the-last-stack #f) (stack-saved? #f)) (define (handle-error key args) (let ((cep (current-error-port))) (if the-last-stack (display-backtrace the-last-stack cep) ; barfs here sometimes (display "no backtrace available.\n" cep)) (apply display-error the-last-stack cep args) (force-output cep) ;(throw 'abort key) )) (define (save-stack) (cond (stack-saved?) ((not (memq 'debug (debug-options-interface))) (set! the-last-stack #f) (set! stack-saved? #t)) (else (set! the-last-stack (make-stack #t lazy-dispatch 4)) (set! stack-saved? #t)))) (define (lazy-dispatch key . args) (save-stack) (apply throw key args)) (start-stack #t (catch #t (lambda () (lazy-catch #t thunk lazy-dispatch)) (lambda (key . args) (if (= (length args) 4) (handle-error key args) (apply throw key args) )))))) i had some trouble understanding the implementation of goodies like lazy-catch, so i'm not quite sure what the above code is doing. anyone have the inclination to share a high level explanation? i am wondering whether the above code could be failing because of a lack of rigorous use of SCM_DEFER_INTS and SCM_ALLOW_INTS. a simpler implementation of call-with-error-catching that doesn't do any funny business with stacks works fine; the program never SEGV's. i really like getting the backtraces when there are errors. any strategies to track this one down? kind regards, -russ