2020-01-17 09:44:01 +04:00
2020-01-04 14:28:08 +04:00
2020-01-11 15:00:04 +04:00
2020-01-04 14:28:08 +04:00
2020-01-13 19:41:45 +04:00
2020-01-16 14:52:34 +04:00
2020-01-16 12:30:59 +04:00
2020-01-04 14:28:08 +04:00
2020-01-04 14:28:08 +04:00

Pretty Stack Trace library

Table of Contents

The goal of the project is to enable C/C++ developers to get informative stack trace in case of program crash (inside of signal handler). Key feature is to log not only function address/name/line etc but (if DWARF .debug_info section is present) values of function's parameters and variables.

Currently development focused on x86_64 architecture and for Linux OS, but further may be expanded to other architectures and OS if it will be demanded and some people will like to contribute to the project to support this architecture and OS.

As a first stage the goal is to dump only C/C++ base types such as pointer, boolean, integer etc.

Second stage dump composite types such as C structures, C++ classes, arrays etc.

Third stage to dump dereferenced pointers to data types with pointer validation.

Dependencies

Currently library mostly depends on libunwind library which used to unwind function's stack frames from stack in signal handler, and libdw library which gives access to DWARF information of executed process if it present.

commands to work with debug information

produce very simple debug info without sources echo 'void foo () {}' | gcc -g -O99 -o - -S -xc - -dA | grep frame_base

dump .debug_info section

readelf --debug-dump=info ./build/trace

objdump --dwarf=info ./build/trace

dump symbol tables of executable

readelf -s ./build/trace

dump file segment headers

readelf -l ./build/trace

dump .eh_frame section

readelf --debug-dump=frames simple

dump list of sections

readelf -S ./build/trace

dump lie section

objdump --dwarf=decodedline

disassemble executable

objdump --d ./build/trace

-funwind-tables tells linker to generate .eh_frame section containing CFI. enabled by default if gcc/g++ used for linking -fexceptions Enable exception handling. Generates extra code needed to propagate exceptions. -rdynamic exports the symbols of an executable, allows to print function names in backtrace -fno-omit-frame-pointer instructs the compiler to store the stack frame pointer in a register RBP for x86_64.

Assembler tutorials

Calling conventions

Functions and stack frames

x86 Assembli guide

GNU extended Asm

DWARF 5 Standard (DWARF comittee)

Introduction to the DWARF Debugging Format (DWARF comittee)

Exception handling (DWARF wiki)

Expression Operator For Constants (DWARF Wiki)

Very informative discussion on dwarf mailing lists about DW_OP_regX vs. DW_OP_bregX 0

Very informative discussion on dwarf mailing list about Semantics of DW_OP_(b)reg

Exploring the DWARF debug format information (IBM)

DWARF: function return value types and parameter types (simple tutorial)

Exploiting the Hard-Working DWARF (slides)

Exploiting the Hard-Working DWARF (article)

Local variable location from DWARF info in ARM

Reliable and Fast DWARF-Based Stack Unwinding

Improving debug info for optimized away parameters (GCC summit 2012, GNU extensions)

VARIABLE TRACKING AT ASSIGNMENTS (Redhat, with link to GCC Wiki)

Good .eh_frame explanation

Good itroduction to Debug information

libdwarf example

Stack trace and other

System V ABI

Programmatic access to the call stack in C++

Where the top of the stack is on x86

Stack frame layout on x86-64

Retrieving function arguments while unwinding the stack

Deep Wizardry: Stack Unwinding (more-less helpful)

Writing a Linux Debugger Part 8: Stack unwinding (other related articles also interesting)

Miscellaneous

Testing pointers for validity (C/C++) (using system calls)

Another way for testing pointer to validity (via procfs)

Implementing a Debugger: The Fundamentals

S
Description
Library to provide advanced information about stack trace for C/C++ programs, including values of variables
Readme MIT
354 KiB
Languages
C 95.8%
Makefile 3.4%
GDB 0.6%
Dockerfile 0.2%