Difference between revisions of "Core file"

From collectd Wiki
Jump to: navigation, search
(Enable core files: New section.)
(Waiting for a crash: New section.)
Line 29: Line 29:
 
Other compilers may differ. If you know how, please add the information here.
 
Other compilers may differ. If you know how, please add the information here.
  
== Enable core files ==
+
== Enabling core files ==
  
 
Many distributions disable the creation of ''core files'' by default, so that the disk isn't filled with useless files if the user doesn't know how to use them.
 
Many distributions disable the creation of ''core files'' by default, so that the disk isn't filled with useless files if the user doesn't know how to use them.
Line 52: Line 52:
 
  ENABLE_COREFILES=1
 
  ENABLE_COREFILES=1
 
   
 
   
 +
== Waiting for a crash ==
 +
 +
If the daemon is restarted with ''core files'' enabled, all you have to do is wait for the daemon to crash again. Until this happens, the core file creation doesn't effect the performance of the daemon. (If you recompiled with <code>-O0</code> the daemon may use a bit more CPU time due to inferior code efficiency, but this has nothing to do with the ''ulimit'' setting.)
 +
 +
=== Locating the core file ===
 +
 +
Once the daemon crashed, a file called <code>core</code> or <code>core.''$PID''</code> will be created in its ''current working directory''. This directory can be set using the [[BaseDir]] setting. By default, this is <code>''$pkglocalstatedir''</code>, i.e. <code>''$prefix''/var/lib/collectd</code>. If you installed a package, this directory is most likely <code>/var/lib/collectd</code>.
  
 
[[Category:Development]]
 
[[Category:Development]]

Revision as of 12:09, 22 May 2010

A core file or core dump is a dump of the application state, including all memory contents, to the disk for further inspection. If collectd crashes due to a bug, the best way to debug this is via such a file. Using a debugger it is possible where exactly the problem occurred and under which circumstances.

In order to create and use a core file, you need to take the following steps:

  • Create an executable with debugging symbols embedded. You can either re-compile with special flags or install a debugging package if one is available.
  • Enable creation of core files.
  • Wait until the daemon crashes again.
  • Inspect the core file to find the source of the problem.

Debugging symbols

In order to get meaningful information from a core file, the executable must be built with debugging symbols.

From a package

The easiest way to obtain debugging symbols is by installing an appropriate debugging package. If you're using Debian, you can install such a debugging package using:

apt-get install collectd-dbg

Other distributions may provide debugging packages, too. If you know of such a distribution, please add the information here.

Compiler flags

If you installed collectd from source or your distribution doesn't provide a debugging package, you can recompile with the appropriate compiler flags.

The exact flags required depend on the compiler used. If you use the C compiler from the GNU Compiler Collection (GCC), the flag -g enables the inclusion of debugging symbols. While you're at it, disable optimization using -O0. This makes it easier to interpret the output of the debugger.

Pass the flags to the configure script using:

$ ./configure $OTHER_FLAGS CFLAGS="-g -O0"

Other compilers may differ. If you know how, please add the information here.

Enabling core files

Many distributions disable the creation of core files by default, so that the disk isn't filled with useless files if the user doesn't know how to use them.

The size of the biggest core file allowed to be written to disk is controlled via ulimit -c. If creation of core files is disabled, you will get the following output:

octo@leeloo:~ $ ulimit -c
0

This means that core dumps are only written if their size is smaller than 0 blocks, i.e. never. You can increase this limit to a reasonable size or use unlimited to force the creation of a core file regardless of its size:

octo@leeloo:~ $ ulimit -c unlimited
octo@leeloo:~ $ ulimit -c
unlimited

Please note that this change only effects the shell it was issues from and the programs started from it. The setting it not global. You need to restart the daemon from this shell or add the ulimit-line to the init-script for the changes to take effect.

Debian

Under Debian GNU/Linux, creation of core files is controlled via the file /etc/default/collectd. You can enable creating core dumps by setting:

ENABLE_COREFILES=1

Waiting for a crash

If the daemon is restarted with core files enabled, all you have to do is wait for the daemon to crash again. Until this happens, the core file creation doesn't effect the performance of the daemon. (If you recompiled with -O0 the daemon may use a bit more CPU time due to inferior code efficiency, but this has nothing to do with the ulimit setting.)

Locating the core file

Once the daemon crashed, a file called core or core.$PID will be created in its current working directory. This directory can be set using the BaseDir setting. By default, this is $pkglocalstatedir, i.e. $prefix/var/lib/collectd. If you installed a package, this directory is most likely /var/lib/collectd.