Since getting core dumps seems to be difficult sometimes, especially
with login processes, I've now added code to log the backtrace when
Dovecot crashes in some assert check (or some other reason why it
decides to abort()). This code works with Linux and Solaris, but I
don't know about BSDs. Apparently there exists libexecinfo library
which could be used.
I think this code could be used to log backtraces also for segfaults,
but that's more risky so I didn't do it yet. Maybe it should be done
only optionally.
If you're interested in trying, the code is now in CVS and in the
latest nightly snapshot.
When it crashes, it prints something like:
Panic: file client.c: line 55 (client_create): assertion failed:
(my_client != NULL)
Error: Backtrace: ./imap [0x80b2ffa] -> ./imap [0x80b2ecc] -> ./imap
[0x805bbb3] -> ./imap(main+0x426) [0x80634a6] -> /lib/tls/libc.so.6
(__libc_start_main+0xc8) [0xb7e53ea8] -> ./imap [0x80566a1]
Looks like the symbol name resolving doesn't work all that great. But
here gdb will help you:
gdb ./imap (gdb) b *0x80b2ffa Breakpoint 1 at 0x80b2ffa: file failures.c, line 126. (gdb) b *0x80b2ecc Breakpoint 2 at 0x80b2ecc: file failures.c, line 185. (gdb) b *0x805bbb3 Breakpoint 3 at 0x805bbb3 (gdb) b *0x80634a6 Breakpoint 4 at 0x80634a6: file main.c, line 223.
That went pretty well, except for some reason it couldn't figure out
where 0x805bbb3 was. To get some kind of an idea about that, you can do:
(gdb) x 0x805bbb3
0x805bbb3
If someone knows better ways to do all of this, please tell me too :)