@@ -267,73 +267,130 @@ $3 = std::vector of length 11, capacity 16 = {{static NPos = 1844674407370955161
267
267
268
268
### Core Dump <a id =" development-debug-core-dump " ></a >
269
269
270
- When the Icinga 2 daemon crashes with a ` SIGSEGV ` signal
271
- a core dump file should be written. This will help
272
- developers to analyze and fix the problem.
270
+ When the Icinga 2 daemon is terminated by ` SIGSEGV ` or ` SIGABRT ` , a core dump file
271
+ should be written. This will help developers to analyze and fix the problem.
273
272
274
- #### Core Dump File Size Limit <a id =" development-debug-core-dump-limit " ></a >
273
+ #### Core Dump Kernel Pattern <a id =" development-debug-core-dump-format " ></a >
275
274
276
- This requires setting the core dump file size to ` unlimited ` .
275
+ Core dumps are generated according to the format specified in
276
+ ` /proc/sys/kernel/core_pattern ` . This can either be a path relative to the
277
+ directory the program was started in, an absolute path or a pipe to a different
278
+ program.
277
279
280
+ For more information see the [ core(5)] ( https://man7.org/linux/man-pages/man5/core.5.html ) man page.
278
281
279
- ##### Systemd
282
+ #### Systemd Coredumpctl < a id = " development-debug-core-dump-systemd " ></ a >
280
283
284
+ Most distributions offer systemd's coredumpctl either by default or as a package.
285
+ Distributions that offer it by default include RHEL and SLES, on others like
286
+ Debian or Ubuntu it can be installed via the ` systemd-coredump ` package.
287
+ When set up correctly, ` core_pattern ` will look something like this:
288
+ ```
289
+ # cat /proc/sys/kernel/core_pattern
290
+ |/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h`
281
291
```
282
- systemctl edit icinga2.service
283
292
284
- [Service]
285
- ...
286
- LimitCORE=infinity
293
+ You can look at the generated core dumps with the ` coredumpctl list ` command.
294
+ You can show information, including a stack trace using
295
+ ` coredumpctl show icinga2 -1 ` and retrieve the actual core dump file with
296
+ ` coredumpctl dump icinga2 -1 --output <file> ` .
287
297
288
- systemctl daemon-reload
298
+ For further information on how to configure and use coredumpctl, read the man pages
299
+ [ coredumpctl(1)] ( https://man7.org/linux/man-pages/man1/coredumpctl.1.html ) and
300
+ [ coredump.conf(5)] ( https://man7.org/linux/man-pages/man5/coredump.conf.5.html ) .
289
301
290
- systemctl restart icinga2
302
+ #### Ubuntu Apport <a id =" development-debug-core-dump-apport " ></a >
303
+
304
+ Ubuntu uses their own application ` apport ` to record core dumps. When it is
305
+ enabled, your ` core_pattern ` will look like this:
306
+ ```
307
+ # cat /proc/sys/kernel/core_pattern
308
+ |/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E
291
309
```
292
310
293
- ##### Init Script
311
+ Apport is unsuitable for development work, because by default it only works
312
+ with Ubuntu packages and it has a rather complicated interface for retrieving
313
+ the core dump. So unless you rely on Apport for some other workflow, systemd's
314
+ coredumpctl is a much better option and is available on Ubuntu in the
315
+ ` systemd-coredump ` package that can replace Apport on your system with no
316
+ further setup required.
294
317
318
+ If you still want to use Apport however, to set it up to work with unpackaged programs,
319
+ add the following (create the file if it doesn't exist) to ` /etc/apport/settings ` :
295
320
```
296
- vim /etc/init.d/icinga2
297
- ...
298
- ulimit -c unlimited
299
-
300
- service icinga2 restart
321
+ [main]
322
+ unpackaged=true
323
+ ```
324
+ and restart Apport:
325
+ ```
326
+ systemctl restart apport.service
301
327
```
302
328
303
- ##### Verify
329
+ When the program crashes you can then find an Apport crash report in ` /var/crash/ `
330
+ that you can read with the interactive ` apport-cli ` command. To extract the core
331
+ dump you run ` apport-unpack /var/crash/<crash-file> <output-dir> ` which then
332
+ saves a ` <outputdir>/CoreDump ` file that contains the actual core dump.
304
333
305
- Verify that the Icinga 2 process core file size limit is set to ` unlimited ` .
334
+ #### Directly to a File < a id = " development-debug- core-dump-direct " ></ a >
306
335
307
- ```
308
- for pid in $(pidof icinga2); do cat /proc/$pid/limits; done
336
+ If coredumpctl is not available, simply writing the core dump directly to a file
337
+ is also sufficient. You can set up your ` core_pattern ` to write a file to a
338
+ suitable path:
309
339
310
- ...
311
- Max core file size unlimited unlimited bytes
340
+ ``` bash
341
+ sysctl -w kernel.core_pattern=/var/lib/cores/core.%e.%p.%h.%t
342
+ install -m 1777 -d /var/lib/cores
312
343
```
313
344
345
+ If you want to make this setting permanent you can also add a file to
346
+ ` /etc/sysctl.d ` , named something like ` 80-coredumps.conf ` :
347
+ ```
348
+ kernel.core_pattern = /var/lib/cores/core.%e.%p.%h.%t
349
+ ```
314
350
315
- #### Core Dump Kernel Format <a id =" development-debug-core-dump-format " ></a >
351
+ This will create core dump files in ` /var/lib/cores ` where ` %e ` is the truncated
352
+ name of the program, ` %p ` is the programs PID, ` %h ` is the hostname, and ` %t ` a
353
+ timestamp.
316
354
317
- The Icinga 2 daemon runs with the SUID bit set. Therefore you need
318
- to explicitly enable core dumps for SUID on Linux.
355
+ Note that unlike the other methods this requires the core size limit to be set
356
+ for the process. When starting Icinga 2 via systemd you can set it to unlimited
357
+ by adding the following to ` /etc/systemd/system/icinga2.service.d/limits.conf ` :
358
+ ```
359
+ [Service]
360
+ LimitCORE=infinity
361
+ ```
319
362
363
+ Then reload and restart icinga:
320
364
``` bash
321
- sysctl -w fs.suid_dumpable=2
365
+ systemctl daemon-reload
366
+ systemctl restart icinga2.service
322
367
```
323
368
324
- Adjust the coredump kernel format and file location on Linux:
369
+ Alternatively you edit and reload in one step:
370
+ ``` bash
371
+ systemctl edit --drop-in=limits icinga2.service`
372
+ ` ` `
325
373
374
+ When using an init script or starting manually, you need to run ` ulimit -c unlimited`
375
+ before starting the program:
326
376
` ` ` bash
327
- sysctl -w kernel.core_pattern=/var/lib/cores/core.%e.%p
377
+ ulimit -c unlimited
378
+ ./icinga2 daemon
379
+ ` ` `
328
380
329
- install -m 1777 -d /var/lib/cores
381
+ To verify that the limit has been set to ` unlimited` run the following:
382
+ ` ` ` bash
383
+ for pid in $( pidof icinga2) ; do cat /proc/$pid /limits; done
384
+ ` ` `
385
+ And look for the line:
386
+ ```
387
+ Max core file size unlimited unlimited bytes
330
388
```
331
389
332
- MacOS:
390
+ #### MacOS <a id="development-debug-core-dump-macos"></a>
333
391
334
392
```bash
335
393
sysctl -w kern.corefile=/cores/core.%P
336
-
337
394
chmod 777 /cores
338
395
```
339
396
0 commit comments