aboutsummaryrefslogtreecommitdiff

preload-libbt

preload-libbt is a utility library for some very special occasions.

It aims to extract a backtrace when a program segfaults, on machines where ptrace(2) syscalls are restricted, and hence launching the program under gdb or attaching wth gdb is not possible.

The library must be LD_PRELOADed, which then installs a signal handler that dumps a stacktrace. For it to work the program must adhere to the following rules:

  • The program must not override the installed signal handler.
  • If the program overrides the signal handler, it needs to implement chaining signal handlers properly.

The preload library libbt.so is build with the default make target.

> make
cc -o libbt.so bt.c -shared -fPIC -static-libgcc -ldl -Wall -Wextra -g

Concept

The library is based on the following features.

  • Global signal disposition for SIGSEGV.
  • Alternate signal stacks.

The signal handler for SIGSEGV is directly executed in the thread generating the segfault. This is fine as long as the segfault is generated from anything other than a stackoverflow. To also support this case, the library installs an alternate signal stack with sigaltstack(2) for each thread by wrapping the pthread_create(3) call.

Support for threads created with raw clone(2) calls is not supported.

The examples recurse1.c and recurse2.c demonstrate the handling for stackoverflows.

Examples

The following gives an example and shows how a stacktrace dump looks like.

cc -o libbt.so bt.c -shared -fPIC -ldl
cc -o raise1 example/raise1.c -rdynamic
LD_PRELOAD=./libbt.so ./raise1

[BT:INFO]: installed signal handler
[BT:INFO]: caught signal 11
# 0 [  0x7f53b9e203f4] /usr/lib/libc.so.6+0x963f4
# 1 [  0x7f53b9dc7120] gsignal+0x20 /usr/lib/libc.so.6+0x3d100
# 2 [  0x55748166c147] foo+0xe raise1+0x1139
# 3 [  0x55748166c158] bar+0xe raise1+0x114a
# 4 [  0x55748166c169] qux+0xe raise1+0x115b
# 5 [  0x55748166c17a] main+0xe raise1+0x116c
# 6 [  0x7f53b9dafe08] /usr/lib/libc.so.6+0x25e08
# 7 [  0x7f53b9dafecc] __libc_start_main+0x8c /usr/lib/libc.so.6+0x25e40
# 8 [  0x55748166c065] _start+0x25 raise1+0x1040

Alternatively one can run make run, to run all examples under example/.

License

This project is licensed under the MIT license.