all 6 comments

sorted by: hot top controversial new old
[–] 16 points 1 year ago (1 child)

I’m going to whoosh the joke for a moment.

Avoid allocating memory in sig segv handlers. I worked at a company once that had written their own handlers that tried to print a stack trace. I was fortunate enough to find a machine in a test environment that segfaulted while allocating memory. The handler then caused a deadlock in a call to malloc (through new). I ended up rewriting the handler to fix two sources of memory allocation. First I preallocate enough space to do string manipulations in the handler. Second I made eager calls to a few libc functions used in the handler to avoid memory allocation from lazy binding from ld.so.

  • source
  • hideshow 1 child comment
  • [–] [S] 4 points 1 year ago

    actually, in the production version i check if the sigsegv handler already got triggered at the start of the handler (to avoid a nested sigsegv) and just exit without any fancy error printing if that happened

    i left it out of this meme bc it would've cluttered up the code snippet.

  • source
  • parent
  • [–] 6 points 1 year ago (3 children)

    🤔 that reminds me of the brainfuck debugger I wrote. Good fun

  • source
  • hideshow 3 child comments
  • [–] [S] 5 points 1 year ago (2 children)

    cool! i once tried to write a brainfuck jit compiler (that just appends raw bytes to a buffer and runs it as x86 machine code if it hits a branching instruction like [ / ])

  • source
  • parent
  • hideshow 2 child comments
  • [–] 3 points 1 year ago (1 child)

    That's cool. Mine is just an interpreter for execution but it has breakpoints, watchpoints, and save states. I've thought about trying to do some form of JIT or at least AOT but I haven't yet made an attempt. Besides for a debugger that's counter productive.

  • source
  • parent
  • hideshow 1 child comment
  • [–] [S] 3 points 1 year ago

    save states are something i've seen very few debugger-enabled interpreters have. on paper, it would probably be as easy as storing the state of the interpreter in a format like a core dump (only requires the ability of reflection)

  • source
  • parent