Instrument C/C++ with -finstrument-functions for execution tracing and Perfetto visualisation
Scanned 9/12/2026
Install to Claude Code
npx -y skills add thedixitjain/the-mega-skill-library --skill function-call-tracing --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Function Call Tracing?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/thedixitjain-function-call-tracing)More formats (shields.io, HTML) on the badges page.
---
name: function-call-tracing
description: "Instrument C/C++ with -finstrument-functions for execution tracing and Perfetto visualisation"
category: devops-and-infra
source_repo: gadievron/raptor
source_path: ".claude/skills/crash-analysis/function-tracing/SKILL.md"
source_url: https://github.com/gadievron/raptor/blob/HEAD/.claude/skills/crash-analysis/function-tracing/SKILL.md
---
# Function Call Tracing
## Purpose
Trace all function calls in C/C++ programs with per-thread logs and Perfetto visualization.
## Components
### 1. Instrumentation Library (trace_instrument.c)
Captures function entry/exit, writes per-thread logs.
**Build:**
```bash
gcc -c -fPIC trace_instrument.c -o trace_instrument.o
gcc -shared trace_instrument.o -o libtrace.so -ldl -lpthread
```
### 2. Perfetto Converter (trace_to_perfetto.cpp)
Converts logs to Chrome JSON for Perfetto UI.
**Build:**
```bash
g++ -O3 -std=c++17 trace_to_perfetto.cpp -o trace_to_perfetto
```
## Usage
### Step 1: Add to Build
```makefile
CFLAGS += -finstrument-functions -g
LDFLAGS += -L. -ltrace -ldl -lpthread
```
### Step 2: Build Target
```bash
make
```
### Step 3: Run
```bash
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
./program
# Creates trace_<tid>.log files
```
### Step 4: Convert to Perfetto
```bash
./trace_to_perfetto trace_*.log -o trace.json
# Open trace.json in ui.perfetto.dev
```
## Log Format
```
[seq] [timestamp] [dots] [ENTRY|EXIT!] function_name
[0] [1.000000000] [ENTRY] main
[1] [1.000050000] . [ENTRY] helper
[2] [1.000100000] . [EXIT!] helper
[3] [1.000150000] [EXIT!] main
```
- Dots indicate call depth
- Timestamp in seconds.nanoseconds
- One log file per thread
## When User Requests Tracing
### Steps
1. Copy `trace_instrument.c` and `trace_to_perfetto.cpp` to project
2. Build instrumentation library
3. Add `-finstrument-functions` to CFLAGS
4. Add `-L. -ltrace -ldl -lpthread` to LDFLAGS
5. Build project
6. Set `LD_LIBRARY_PATH` and run
7. Convert logs: `./trace_to_perfetto trace_*.log -o trace.json`
8. Provide link to ui.perfetto.dev
### Build System Detection
**Makefile:** Add flags conditionally
```makefile
ENABLE_TRACE ?= 0
ifeq ($(ENABLE_TRACE),1)
CFLAGS += -finstrument-functions -g
LDFLAGS += -L. -ltrace -ldl -lpthread
endif
```
**CMake:** Add option
```cmake
option(ENABLE_TRACE "Enable tracing" OFF)
if(ENABLE_TRACE)
add_compile_options(-finstrument-functions -g)
link_libraries(trace dl pthread)
endif()
```
## Output
- **trace_<tid>.log**: Per-thread text logs
- **trace.json**: Perfetto Chrome JSON format
- View at https://ui.perfetto.dev
## Perfetto JSON Format
Function ENTRY → "B" (begin) event
Function EXIT! → "E" (end) event
All threads aligned by timestamp in single file.
---
**Source:** [`gadievron/raptor`](https://github.com/gadievron/raptor) → `.claude/skills/crash-analysis/function-tracing/SKILL.md`
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!