Hello Noam,

I'm sorry for the late reply. I have been having some problems with the power source of my computer as of lately. Everything seems to be doing fine now though, so I'll get back to this.

I made a very simple program that just prints a bunch of stuff to stdout and stderr:

If I run it without your patches, it works surprisingly just fine (I noticed the original errors pop up most commonly on Slack I guess because it prints a lot more?), whereas if I evaluate said patches, this is the output of the trace buffer:

======================================================================
1 -> (comint-output-filter #<process Shell> "stdout:
hello, world
Im gonna print some stuff
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
stderr:
AHHHH PANIC CATASTROPHIC FAILIURE!!!
The quick brown fox jumps over the lazy dog.
")(:comint-pmark nil)
| 2 -> (set-marker #<marker in no buffer> 1)(:comint-pmark nil)
| 2 <- set-marker: #<marker at 1 in *Async Shell Command*>(:comint-pmark (#<marker at 1 in *Async Shell Command*> . #<marker at 1 in *Async Shell Command*>))
| 2 -> (set-marker #<marker at 1 in *Async Shell Command*> 191)(:comint-pmark (#<marker at 1 in *Async Shell Command*> . #<marker at 1 in *Async Shell Command*>))
| 2 <- set-marker: #<marker at 191 in *Async Shell Command*>(:comint-pmark (#<marker at 1 in *Async Shell Command*> . #<marker at 191 in *Async Shell Command*>))
| 2 -> (ansi-color-process-output "stdout:
hello, world
Im gonna print some stuff
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
stderr:
AHHHH PANIC CATASTROPHIC FAILIURE!!!
The quick brown fox jumps over the lazy dog.
")(:comint-pmark (#<marker at 1 in *Async Shell Command*> . #<marker at 191 in *Async Shell Command*>))
| 2 <- ansi-color-process-output: nil(:comint-pmark (#<marker at 1 in *Async Shell Command*> . #<marker at 191 in *Async Shell Command*>))
| 2 -> (comint-adjust-window-point #<window 31 on *Async Shell Command*> #<process Shell>)(:comint-pmark (#<marker at 1 in *Async Shell Command*> . #<marker at 191 in *Async Shell Command*>))
| 2 <- comint-adjust-window-point: nil(:comint-pmark (#<marker at 1 in *Async Shell Command*> . #<marker at 191 in *Async Shell Command*>))
| 2 -> (set-marker #<marker (moves after insertion) at 191 in *Async Shell Command*> 191)(:comint-pmark (#<marker at 1 in *Async Shell Command*> . #<marker at 191 in *Async Shell Command*>))
| 2 <- set-marker: #<marker (moves after insertion) at 191 in *Async Shell Command*>(:comint-pmark (#<marker at 1 in *Async Shell Command*> . #<marker at 191 in *Async Shell Command*>))
1 <- comint-output-filter: #<marker (moves after insertion) at 191 in *Async Shell Command*>(:comint-pmark nil)

I am not sure what does this mean, perhaps it is some special character Slack uses for logging that messes with those markers, I don't know. Maybe I could try printing all of the ASCII characters sequentially and see what happens.

Regardless, I'm still not entirely sure what your code is doing anyway.

Thanks, Jacob

PS: I don't know if I might have accidentally sent the message halfway writing it; if you see anything weird in another message, that might be the reason why.

On 21/04/2020 04:29, Noam Postavsky wrote:
Jacob Lagares Pozo <jlagarespo@iebesalu.cat> writes:

I should probably make a simple program that prints a bunch of stuff
and then hangs, so I can have predictable and reproducible output,
that might help.
It occurs to me that you should see a "non-local exit" in the trace when
the error triggers, and the traces just before that should hopefully
show the swapping of marker positions occuring.

So what do you exactly mean by that the process is ending normally?
Oh, hmm, I was still a bit confused.  I thought the (:comint-pmark nil)
meant the marker was deleted, but actually it's just because around the
call to comint-output-filter a different buffer is current (which makes
the check in the tracing function fail).  Maybe one more tweak to the
tracing function:

    (defun bug-40323-get-comint-output-marker ()
      (list :comint-pmark
            (let ((buf (and (markerp comint-last-output-start)
                            (marker-buffer comint-last-output-start))))
              (when (buffer-live-p buf)
                (cons
                 comint-last-output-start
                 (process-mark (get-buffer-process buf)))))))