LCOV offline coverage report
Read one local LCOV 1.x tracefile, recompute coverage totals, retain unknown branches and download a complete offline HTML report.
- 1Add input
- 2Adjust settings
- 3Get your result
Tool input and files are processed in this browser without being uploaded.
Before you start
Review coverage exported by your test runner without reading source paths. Inspect the real line/function/branch counts, compare stale declared counters and keep a standalone HTML report beside the tracefile.
How to use this tool
- Paste or open one complete LCOV 1.x tracefile from the test runner.
- Check recomputed totals, unknown branches and declared-versus-actual summary differences.
- Download coverage.html plus complete JSON/CSV. Open HTML locally and retain the original tracefile.
Supported inputs and limits
One UTF-8 file or pasted tracefile up to 5 MiB, 50,000 coverage points (DA + FN + BRDA) and 1,000 complete source records. One record per exact source path; duplicate paths reject instead of silently merging test contexts. Selected file takes precedence. Total downloads up to 10 MiB; table preview first 200 records.
Supports LCOV 1.x TN, SF, FN, FNDA, DA, BRDA, LF/LH/FNF/FNH/BRF/BRH and optional VER. FNDA and FN order may differ; every function needs both location and count. Counts and branch identifiers are nonnegative uint64; source lines are 1–2147483647. DA checksum, when supplied, is 32 hexadecimal characters. New FN end-line, FNL/FNA and MC-DC extensions reject.
Coverage totals are recomputed from actual points. Declared summary differences stay visible in the report; they do not become the denominator. BRDA “-” remains unknown, contributes to found branches and is never changed into a hit count of zero. A zero denominator is n/a/null rather than 100%.
Full HTML lists every point and summary difference, escapes all file/test/function text and contains no scripts or links that read source paths. JSON preserves uint64 hit counts as decimal strings. CSV contains every source record; spreadsheet protection may prefix formula-like labels. No source fetching, tracefile merging, test execution or coverage measurement.
Worked example
Example input
TN:unit SF:src/example.c FN:1,covered FN:4,missing FNDA:3,covered FNDA:0,missing DA:1,3 DA:2,0 DA:4,0 BRDA:1,0,0,3 BRDA:1,0,1,- LF:3 LH:1 FNF:2 FNH:1 BRF:2 BRH:1 end_of_record
Example options
{"secondary":"","params":{"spreadsheetSafe":true}}Example output
{
"format": "LCOV 1.x",
"records": [
{
"path": "src/example.c",
"testName": "unit",
"version": null,
"lines": [
{
"line": 1,
"hits": "3",
"checksum": null
},
{
"line": 2,
"hits": "0",
"checksum": null
},
{
"line": 4,
"hits": "0",
"checksum": null
}
],
"functions": [
{
"name": "covered",
"line": 1,
"hits": "3"
},
{
"name": "missing",
"line": 4,
"hits": "0"
}
],
"branches": [
{
"line": 1,
"block": "0",
"branch": "0",
"hits": "3"
},
{
"line": 1,
"block": "0",
"branch": "1",
"hits": null
}
],
"declared": {
"LF": "3",
"LH": "1",
"FNF": "2",
"FNH": "1",
"BRF": "2",
"BRH": "1"
},
"computed": {
"LF": 3,
"LH": 1,
"FNF": 2,
"FNH": 1,
"BRF": 2,
"BRH": 1
},
"summaryDifferences": []
}
],
"coverPoints": 7,
"lines": 3,
"lineHits": 1,
"functions": 2,
"functionHits": 1,
"branches": 2,
"branchHits": 1,
"unknownBranches": 1,
"summaryDifferences": 0,
"summaryCountersAgree": true,
"lineCoveragePercent": 33.333333333333336,
"functionCoveragePercent": 50,
"branchCoveragePercent": 50
}When something does not work
Check matching FN/FNDA names, unique coverage-point keys, complete end_of_record markers, nonnegative uint64 counts and the supported LCOV version. Regenerate duplicate-path or extended-format traces with the producer. For stale counters, use the reported actual values. Correct the original and rerun.
Frequently asked questions
Why does a summary counter disagree?
The tool recomputes totals from coverage points. A syntactically valid stale LF/LH or other counter is reported with its actual value; the report does not use it to inflate coverage.
Does “-” mean a branch was taken zero times?
No. It means no execution count is available. The branch remains unknown and is included in the found-branch denominator.
Can the report show source text or combine runs?
No. Paths are escaped labels and are never read or fetched. Duplicate source paths and newer format extensions reject; export a supported complete tracefile from the producer.
Documentation & further reading
Related tools
JSON formatting workspace
Format or minify strict JSON, sort object keys, and encode or decode strings while preserving raw number tokens.
Regex tester
Try a pattern and see what it matches in your text.
Compare text
See what changed, side by side.
HTML formatter
Format HTML indentation so its structure is easier to read.