Core dumps are often used to diagnose or debug errors in Linux or UNIX programs. Core dumps can serve as useful debugging aids for sysadmins to find out why an application or any other program crashed.
This article provides some baselines on enabling core dumps on the main Linux distributions and on making a core dump of a process.
A core dump is a file containing a process’s address space (memory) when the process terminates unexpectedly. Core dumps may be produced on-demand (such as by a debugger), or automatically upon termination. Support engineers may ask for a core dump after a PostgreSQL crash to understand the state of PostgreSQL during the failure.
Enabling core dump production changes between the distributions.
Below are the instructions for:
- Ubuntu 16/18/20
- Debian 9/10
- Rocky 8/9
Ubuntu 16.04 (Xenial) 18.04 (Bionic) 20.04 (Focal)
Since all of them have systemd
enabled as system and sessions manager, the following is the procedure to enable core dumps:
Systemd will not use /etc/security/limits.conf
, the limits will be defined in the service unit or in the global systemd
configuration.
First, create the directory in which the core dumps will be stored and change kernel.core_pattern
to store the dumps in the said directory:
# mkdir -p /var/coredumps
You can choose a different location to store the core dumps, as long as you find a partition with enough free space.
Moreover, keep in mind that the users running the postmaster
service (i.e., postgres
and/or enterprisedb
) will have to be able to write their core dumps in that directory:
# chmod a+w /var/coredumps
# sysctl kernel.core_pattern=/var/coredumps/core-%e-%p
kernel.core_pattern
setting can be persisted across reboots:
# echo 'kernel.core_pattern=/var/coredumps/core-%e-%p' >> /etc/sysctl.conf
Then, you can override the PostgreSQL service unit to define the core limit or, alternatively, specify a global default limit for all the services.
- To set the limit only for the PostgreSQL service, run
# systemctl edit postgresql-15.service
and paste the following snippet:
[Service]
LimitCORE=infinity
Then reload the service configuration:
# systemctl daemon-reload
- To change the global default you can edit
/etc/systemd/system.conf
setting
DefaultLimitCORE=infinity
and then restarting systemd
# systemctl daemon-reexec
Restart PostgreSQL:
# systemctl stop postgresql-15
# systemctl start postgresql-15
At this point, the core dumps should be enabled correctly and you can proceed with the installation of the gdb
tool and the debug packages.
On Ubuntu 18.04:
# apt-get install gdb postgresql-15-dbgsym
whereas on Ubuntu 16.04 the name of the debug package is slightly different:
# apt-get install gdb postgresql-15-dbg
Replace the path to a core dump file such as below:
gdb /usr/lib/postgresql/15/bin/postgres /var/coredumps/core-postgres-42317
You can see that core-postgres-42317
is the core dump produced? Finally, you can get a backtrace, running:
(gdb) bt full
in the gdb
console.
Debian 9 (Stretch) and 10 (Buster)
To enable core dumps on Debian Stretch and on Debian Buster you can follow the same procedure we described for Ubuntu 18.04. The debug package names are the same as well.
RHEL or Rocky Linux
On RHEL/Rocky Linux 8.x, core file creation is disabled by default. To enable the core file generation, follow the following commands:
- Identify the system’s current limit using the
ulimit -c
orulimit -a
command.0
indicates that core file generation is disabled. - Create the directory to store the core dump <refer to the commands above>
- Use the following command to persist the
kernel.core_pattern
setting across reboots:
echo 'kernel.core_pattern=/var/coredumps/core-%e-%p' >> /etc/sysctl.conf
Enable core dumps in /etc/security/limits.conf
to allow a user to create core files. Each line describes a limit for a user in the following form:
<domain> <type> <item> <value>
* soft core unlimited
The *
enables core dump size to be unlimited.
Edit the core limit in the service file – /etc/systemd/system/postgres.service
[Service]
LimitCore=Infinity
Reload the service configurations to make sure the changes take effect:
# systemctl daemon-reload
# systemctl stop postgresql-15
# systemctl start postgresql-15
Now that the core dumps are enabled, install the gdb
tool and debug packages for your Operating system:
# yum install gdb
# debuginfo-install postgresql11-server
Happy Debugging!
Leave a Reply