Recently somebody reported that my console-based mail-client was segfaulting when opening an IMAP folder, and then when they tried with a local Maildir-hierarchy the same fault was observed.
I couldn't reproduce the problem at all, as neither my development host (read "my personal desktop"), nor my mail-host had been crashing at all, both being in use to read my email for several months.
Debugging crashes with no backtrace, or real hint of where to start, is a challenge. Even when downloading the same Maildir samples I couldn't see a problem. It was only when I decided to see if I could add some more diagnostics to my code that I came across a solution.
My intention was to make it easier to receive a backtrace, by adding more compiler options:
-fsanitize=address -fno-omit-frame-pointer
I added those options and my mail-client immediately started to segfault on my own machine(s), almost as soon as it started. Ultimately I found three pieces of code where I was allocating C++ objects and passing them to the Lua stack, a pretty fundamental part of the code, which were buggy. Once I'd tracked down the areas of code that were broken and fixed them the user was happy, and I was happy too.
Its interesting that I've been running for over a year with these bogus things in place, which "just happened" to not crash for me or anybody else. In the future I'll be adding these options to more of my C-based projects, as there seems to be virtually no downside.
In related news my console editor has now achieved almost everything I want it to, having gained:
- Syntax highlighting via Lua + LPEG
- Support for TAB completion of Lua-code and filenames.
- Bookmark support.
- Support for setting the mark and copying/cutting regions.
The only outstanding feature, which is a biggy, is support for Undo which I need to add.
Happily no segfaults here, so far..
Tags: debugging, development 2 comments