Christopher Baines <m...@cbaines.net> writes:

> Christopher Baines <m...@cbaines.net> writes:
>
>> I've been seeing some strange occasional errors for a while now.
>
> ...
>
>> I'm not sure what the 84 means? If I'm picking out the characters that
>> have failed to be encoded, I'm not sure why some of these would fail
>> (like space or w)?
>>
>> Unfortunately I'm not sure how to reproduce this. Suspendable ports
>> might be a factor here as that is probably in use.
>
> Still seeing these errors, including today. I've managed to stumble on a
> reliable and somewhat minimal way of reproducing them:

Here's a slightly simplified version with some comments:

(use-modules (ice-9 binary-ports)
             (rnrs bytevectors)
             (ice-9 exceptions)
             (ice-9 threads)
             (system repl debug))

(setvbuf (current-output-port) 'line)
(setvbuf (current-error-port) 'line)

(simple-format (current-error-port)
               "current-output-port: ~A (encoding: ~A)\n\n"
               (current-output-port)
               (port-encoding (current-output-port)))

(for-each
 (lambda (i)
   (call-with-new-thread
    (lambda ()
      (with-exception-handler
          (lambda (exn)
            (let ((stack (make-stack #t)))
              (print-frames (stack->vector stack)
                            (current-error-port)
                            #:count (stack-length stack))
              (print-exception
               (current-error-port)
               (stack-ref stack 3)
               '%exception
               (list exn)))
            (force-output (current-error-port))

            (primitive-exit 1))
        (lambda ()
          (while #t
            (with-exception-handler
                (lambda (exn)
                  ;; The put-char error seems to happen around here
                  (simple-format (current-output-port)
                                 "exception: ~A\n"
                                 exn)
                  #f)
              (lambda ()
                (with-throw-handler #t
                  (lambda ()
                    ;; Cause some error, I think any error will do
                    (+ 'a 1))
                  (lambda (key . args)
                    (let* ((stack (make-stack #t 3))
                           (backtrace
                            (call-with-output-string
                              (lambda (port)
                                (display-backtrace stack port)
                                (newline port)))))
                      (display
                       ;; Printing the backtrace seems significant,
                       ;; other strings don't seem to reproduce the
                       ;; behaviour
                       backtrace
                       (current-output-port))
                      #f))))
              #:unwind? #t)))))))
 (iota 2))

(sleep 60)

Attachment: signature.asc
Description: PGP signature

Reply via email to