Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,12 @@ grep "pattern" file.txt # Automatically captures coverage
./run_unit_tests.sh
```

Pre-captured coverage logs are available in `tests/sample_data/` to develop or test report generation without needing a live eBPF environment:

```bash
./funkoverage report tests/sample_data/ /tmp/report/
```

## 📎 Technical Details

- **eBPF Uprobes**: Uses kernel uprobes to trigger events on function entry.
Expand Down
2 changes: 1 addition & 1 deletion cmd/funkoverage.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import (
"strings"
)

const versionString = "0.7.0"
const versionString = "0.7.1"

// command is one funkoverage subcommand. run receives the args after the
// subcommand name (so for "funkoverage install -no-libs foo", run sees
Expand Down
7 changes: 5 additions & 2 deletions cmd/shim_binary/tracer.go
Original file line number Diff line number Diff line change
Expand Up @@ -131,13 +131,16 @@ func (t *Tracer) Start(rootPID uint32) error {
for img, cookies := range t.imgCookies {
ex, err := link.OpenExecutable(img)
if err != nil {
return fmt.Errorf("tracer: open executable %s: %w", img, err)
// Some libraries lack the execute bit (packaging bug); skip rather than abort.
fmt.Fprintf(os.Stderr, "funkoverage-shim: skipping %s: %v\n", img, err)
continue
}
l, err := ex.UprobeMulti(t.imgSymbols[img], t.objs.TraceUprobe, &link.UprobeMultiOptions{
Cookies: cookies,
})
if err != nil {
return fmt.Errorf("tracer: attach uprobes on %s (%d symbols): %w", img, len(cookies), err)
fmt.Fprintf(os.Stderr, "funkoverage-shim: skipping uprobes on %s: %v\n", img, err)
continue
}
t.links = append(t.links, l)
}
Expand Down
16,781 changes: 0 additions & 16,781 deletions example/sample_data/curl_20260421-084550_424244546.log

This file was deleted.

3,274 changes: 0 additions & 3,274 deletions example/sample_data/gzip_20250709-103024_152364313.log

This file was deleted.

3,257 changes: 0 additions & 3,257 deletions example/sample_data/gzip_20250709-103035_276834499.log

This file was deleted.

3,241 changes: 0 additions & 3,241 deletions example/sample_data/md5sum_20250709-104648_272113752.log

This file was deleted.

3,236 changes: 0 additions & 3,236 deletions example/sample_data/md5sum_20250709-104658_964309889.log

This file was deleted.

3,241 changes: 0 additions & 3,241 deletions example/sample_data/md5sum_20250709-104725_965662919.log

This file was deleted.

3,243 changes: 0 additions & 3,243 deletions example/sample_data/md5sum_20250709-104753_544630173.log

This file was deleted.

3,243 changes: 0 additions & 3,243 deletions example/sample_data/md5sum_20250709-104805_468036704.log

This file was deleted.

3,249 changes: 0 additions & 3,249 deletions example/sample_data/md5sum_20250709-104814_773412252.log

This file was deleted.

10,851 changes: 0 additions & 10,851 deletions example/sample_data/powertop_20250721-111641_920532457.log

This file was deleted.

4,273 changes: 0 additions & 4,273 deletions example/sample_data/tar_20250709-103110_968508189.log

This file was deleted.

4,305 changes: 0 additions & 4,305 deletions example/sample_data/tar_20250709-103111_245546976.log

This file was deleted.

5,297 changes: 0 additions & 5,297 deletions example/sample_data/tar_20250709-103113_638508268.log

This file was deleted.

5,730 changes: 0 additions & 5,730 deletions example/sample_data/top_20250709-103528_989328402.log

This file was deleted.

5,516 changes: 0 additions & 5,516 deletions example/sample_data/top_20250709-103648_883378274.log

This file was deleted.

5,712 changes: 0 additions & 5,712 deletions example/sample_data/top_20250709-103656_899304403.log

This file was deleted.

3,258 changes: 0 additions & 3,258 deletions example/sample_data/unzip_20250709-103043_140469336.log

This file was deleted.

5,167 changes: 0 additions & 5,167 deletions example/sample_data/vmstat_20250709-103537_160591985.log

This file was deleted.

5,147 changes: 0 additions & 5,147 deletions example/sample_data/vmstat_20250709-103539_340196431.log

This file was deleted.

4,942 changes: 0 additions & 4,942 deletions example/sample_data/vmstat_20250709-103546_351151890.log

This file was deleted.

5,147 changes: 0 additions & 5,147 deletions example/sample_data/vmstat_20250709-103553_709903182.log

This file was deleted.

4,945 changes: 0 additions & 4,945 deletions example/sample_data/vmstat_20250709-103606_823549557.log

This file was deleted.

24 changes: 7 additions & 17 deletions rpm/coverage-tools.spec
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#
# spec file for package coverage-tools
#
# Copyright (c) 2025 SUSE LLC
# Copyright (c) 2026 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
Expand All @@ -14,25 +14,18 @@

# Please submit bugfixes or comments via https://bugs.opensuse.org/

%define bversion 0.8.0
%define bversion 0.7.1
%define dname BinaryCoverage-%{bversion}
Name: coverage-tools
Version: 0.7.0
Version: 0.7.1
Release: 0
Summary: Function-level binary coverage via eBPF (uprobe_multi)
Summary: Tools to test binary coverage of different packages
License: MIT AND GPL-2.0-only
URL: https://github.com/ilmanzo/BinaryCoverage
URL: https://github.com/ilmanzo/CodeCoverage
Source0: %{dname}.tar.gz
Source1: vendor.tar.gz

# Build-time (pre-generated BPF bindings are shipped in the tarball)
BuildRequires: go >= 1.26
ExclusiveArch: x86_64
# Only needed to regenerate BPF bindings (REGEN_BPF=1):
#BuildRequires: clang
#BuildRequires: bpftool
#BuildRequires: libbpf-devel

# Runtime: setcap is invoked by `funkoverage install` to grant CAP_BPF /
# CAP_PERFMON / CAP_DAC_READ_SEARCH to each shim copy. elfutils is used by
# the DWARF enumeration path for binaries with split debug info.
Expand All @@ -51,16 +44,13 @@ every enumerated function (via DWARF or .symtab/.dynsym), records the
first call of each via a kernel ringbuf, and writes a CALLED log used
to generate HTML / XML / text coverage reports.

No source code, no recompilation of the target, no Intel Pin.

Requires kernel ≥6.6 (uprobe_multi) and CONFIG_DEBUG_INFO_BTF=y.

%prep
%autosetup -n %{dname} -a1

%build
export GOFLAGS="-buildmode=pie -trimpath -mod=vendor"
mv %{_builddir}/vendor .
#mv %{_builddir}/vendor .
go build -ldflags="-s -w" -o funkoverage ./cmd/
go build -ldflags="-s -w" -o funkoverage-shim ./cmd/shim_binary/

Expand All @@ -80,4 +70,4 @@ install -m 0755 funkoverage-shim %{buildroot}%{_libdir}/coverage-tools/funkovera
%{_bindir}/funkoverage
%{_libdir}/coverage-tools/

%changelog
%changelog
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
FUNC /var/coverage/bin/bzip2 mySIGSEGVorSIGBUScatcher
FUNC /var/coverage/bin/bzip2 copyFileName
FUNC /var/coverage/bin/bzip2 addFlagsFromEnvVar
FUNC /var/coverage/bin/bzip2 snocString
FUNC /var/coverage/bin/bzip2 uncompress
FUNC /var/coverage/bin/bzip2 compress
FUNC /var/coverage/bin/bzip2 license
FUNC /var/coverage/bin/bzip2 testf
FUNC /var/coverage/bin/bzip2 mySignalCatcher
FUNC /var/coverage/bin/bzip2 usage
FUNC /var/coverage/bin/bzip2 redundant
FUNC /var/coverage/bin/bzip2 copyFileName.cold
FUNC /var/coverage/bin/bzip2 addFlagsFromEnvVar.cold
FUNC /var/coverage/bin/bzip2 snocString.cold
FUNC /var/coverage/bin/bzip2 outOfMemory
FUNC /var/coverage/bin/bzip2 compressStream
FUNC /var/coverage/bin/bzip2 panic
FUNC /var/coverage/bin/bzip2 compress.cold
FUNC /var/coverage/bin/bzip2 applySavedTimeInfoToOutputFile.constprop.0
FUNC /var/coverage/bin/bzip2 ioError
FUNC /var/coverage/bin/bzip2 pad.constprop.0
FUNC /var/coverage/bin/bzip2 fileExists
FUNC /var/coverage/bin/bzip2 fopen_output_safely.constprop.0
FUNC /var/coverage/bin/bzip2 notAStandardFile.constprop.0
FUNC /var/coverage/bin/bzip2 uncompressStream
FUNC /var/coverage/bin/bzip2 uncompress.cold
FUNC /var/coverage/bin/bzip2 myfeof
FUNC /var/coverage/bin/bzip2 uncompressStream.cold
FUNC /var/coverage/bin/bzip2 showFileNames
FUNC /var/coverage/bin/bzip2 cadvise
FUNC /var/coverage/bin/bzip2 cleanUpAndFail
FUNC /var/coverage/bin/bzip2 configError
FUNC /var/coverage/bin/bzip2 applySavedFileAttrToOutputFile
FUNC /var/coverage/bin/bzip2 myfeof.cold
FUNC /var/coverage/bin/bzip2 compressStream.cold
FUNC /var/coverage/bin/bzip2 uInt64_toAscii.isra.0
FUNC /var/coverage/bin/bzip2 testStream
FUNC /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzRead
FUNC /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzWriteOpen
FUNC /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzCompressEnd
FUNC /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzBuffToBuffDecompress
FUNC /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzCompress
FUNC /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzread
FUNC /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzCompressInit
FUNC /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzdopen
FUNC /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzWriteClose64
FUNC /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzopen
FUNC /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzDecompress
FUNC /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzReadOpen
FUNC /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzwrite
FUNC /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzWrite
FUNC /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzBuffToBuffCompress
FUNC /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzReadGetUnused
FUNC /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzlibVersion
FUNC /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzWriteClose
FUNC /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzflush
FUNC /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzDecompressEnd
FUNC /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzerror
FUNC /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzDecompressInit
FUNC /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzclose
FUNC /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzReadClose
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
CALLED /var/coverage/bin/bzip2 copyFileName
CALLED /var/coverage/bin/bzip2 addFlagsFromEnvVar
CALLED /var/coverage/bin/bzip2 snocString
CALLED /var/coverage/bin/bzip2 compress
CALLED /var/coverage/bin/bzip2 compressStream
CALLED /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzWriteOpen
CALLED /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzCompressInit
CALLED /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzWrite
CALLED /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzCompress
CALLED /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzWriteClose64
CALLED /lib64/glibc-hwcaps/x86-64-v3/libbz2.so.1.0.6 BZ2_bzCompressEnd
Loading