Skip to content

Diagnostics

Three diagnostic passes plus two verbosity flags tell you exactly what the obfuscator resolved, ran, and skipped — use them before assuming a bug.

obf-dump-config

Prints the resolved per-function config and derived seeds. The fastest check that your annotation grammar is valid and the passes you expect are enabled with the options you set:

opt -passes=obf-dump-config -S app.ll -o /dev/null -obf-verbose -obf-seed=1

If a pass you annotated isn't listed, the annotation didn't parse — check parenthesis balance and key names (keys use no dashes).

obf-metrics

Emits per-function JSONL metrics (instruction counts, cyclomatic complexity, etc.):

opt -passes=obf-metrics -S app.ll -o /dev/null > metrics.jsonl

Run it on the input and the output to measure a pass's impact.

obf-verify

-obf-verify runs IR verification before/after each stage, so an invalid transform is reported at the pass that produced it rather than as a mysterious downstream crash. Keep it on while developing an annotation set.

-obf-verbose

Prints parsing decisions, skip reasons, budget utilisation, and the resolved pipeline order. The first thing to reach for when a function is "unexpectedly not obfuscated":

opt -passes=obfuscation -S app.ll -o app.obf.ll -obf-seed=1 -obf-verbose

Full reports

For CFG snapshots and the HTML viewer, use -obf-report-dir — see Reports & CFG visualization.

Common questions → which tool

Question Tool
Did my annotation parse? Which passes are enabled? obf-dump-config
Why was this function skipped? -obf-verbose (skip reasons)
How much did a pass grow the function? obf-metrics (before/after) or report JSON
Which pass produced invalid IR? -obf-verify
What did the CFG look like after each pass? -obf-report-dir + HTML viewer
Was output reproducible? fixed -obf-seed + diff (see reproducible builds)