Skip to content

Instantly share code, notes, and snippets.

@lukecampbell
Last active January 2, 2016 21:19
Show Gist options
  • Save lukecampbell/8363139 to your computer and use it in GitHub Desktop.
Save lukecampbell/8363139 to your computer and use it in GitHub Desktop.
PostgreSQL SEGFAULT Analysis

While attempting to initialize the server as a "postgres" user with:

sudo -u postgres /opt/postgresql-9.3.1/bin/postgres /var/postgres

A segmentation fault occurred. Here's the stack trace from gdb:

#0  0x000000000085b246 in palloc (size=1024) at mcxt.c:647
647		CurrentMemoryContext->isReset = false;

(gdb) bt
#0  0x000000000085b246 in palloc (size=1024) at mcxt.c:647
#1  0x0000000000625750 in initStringInfo (str=0x7fff1c878c10) at stringinfo.c:50
#2  0x0000000000837d5b in expand_fmt_string (fmt=0x9c51b0 "could not change directory to \"%s\": %s", edata=0xc9d680) at elog.c:2886
#3  0x0000000000834e00 in elog_finish (elevel=15, fmt=0x9c51b0 "could not change directory to \"%s\": %s") at elog.c:1288
#4  0x0000000000875796 in resolve_symlinks (path=0x7fff1c87a2e0 "/opt/postgresql-9.3.1/bin/postgres") at exec.c:293
#5  0x000000000087527f in find_my_exec (argv0=0x1989a60 "/opt/postgresql-9.3.1/bin/postgres", retpath=0x7fff1c87a2e0 "/opt/postgresql-9.3.1/bin/postgres") at exec.c:144
#6  0x0000000000875b1c in set_pglocale_pgservice (argv0=0x1989a60 "/opt/postgresql-9.3.1/bin/postgres", app=0x959448 "postgres-9.3") at exec.c:561
#7  0x0000000000636a56 in main (argc=3, argv=0x1989a30) at main.c:

The server was compiled with:

$ CFLAGS=-ggdb PYTHON=/usr/local/bin/python ./configure --enable-debug --prefix=/opt/postgresql-9.3.1 --enable-thread-safety --with-gssapi --with-openssl --with-libxml --with-libxslt --with-python

No errors during make or make install

I confirmed with some debugging that CurrentMemoryContext is NULL when this point in the code is reached. The context should have been initialized before palloc was called by initStringInfo. I don't know where in the workflow it is supposed to be initialized but I seem to have stumbled onto an edge-case where it wasn't initialized and palloc was called.

    backend/utils/mmgr/mcxt.c
646
647         CurrentMemoryContext->isReset = false;
648
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment