Script Valley
Debugging: A Systematic Approach
Testing as a Debugging ToolLesson 5.3

How to use binary search to isolate a bug in a large codebase

binary search debugging, divide and conquer, code commenting strategy, input bisection, execution path narrowing

Binary Search as a Debugging Strategy

When a bug exists somewhere in a large system and you do not know where, binary search is the fastest way to find it. Divide the suspect code in half. Determine which half contains the bug. Repeat until the bug is in a single unit. This approach finds a fault in log2(n) steps -- far faster than linear investigation.

Applying It to Code

// Pipeline of 8 transforms, output is wrong:
// input then T1 then T2 then T3 then T4 then T5 then T6 then T7 then T8 then wrong output

// Check the midpoint output
const midResult = applyTransforms(input, [T1, T2, T3, T4]);
console.log('After T4:', midResult);
// If midResult is correct: bug is in T5 through T8
// If midResult is wrong:  bug is in T1 through T4

// Narrowed to T1-T4: check midpoint again
const quarterResult = applyTransforms(input, [T1, T2]);
// If correct: bug is in T3 or T4
// If wrong:   bug is in T1 or T2

Bisecting Input

Binary search also applies to input data. If a function fails on a large dataset, split the dataset in half and run the function on each half. The half that fails contains the problematic data. Repeat until you have the minimal failing input. This is how you construct a minimal reproducible example quickly from real-world data.

Up next

How property-based testing finds bugs you never thought to test

Sign in to track progress