Debugging tools by category, and what each assumes

Steppers and inspectors

  • Pause execution and look at state.

  • Assumes you can trigger the failure on demand.

Logs and tracing

  • See what happened after the fact, including in production.

  • Assumes you logged the right thing beforehand.

Profilers

  • Find where time or memory goes.

  • Assumes the problem is resource shaped.

Every one of them assumes you have already gotten to the failure. That assumption is where the hours actually go.

The missing step

A reliable reproduction is the highest-value artifact in debugging and the one least likely to exist. Without it you are guessing, and with it every other tool becomes effective immediately.

What makes a reproduction reliable is that it is written down as steps with an expected outcome, not held in someone's memory. Written down, it can be re-run, handed to someone else, and kept after the fix.

Why this matters more with a coding agent

When the fixer is an agent, a vague description is much worse than it is for a person. A human can infer what you meant from a screenshot. An agent needs the sequence and the divergence stated explicitly, and it will confidently fix the wrong thing given anything less.

The order to try things in

Given a bug you cannot immediately explain, there is a sequence that converges faster than following your first hypothesis, mostly because your first hypothesis is usually about the code and the answer often is not.

Does it happen from a completely clean state. If not, it is leftover state and nothing in the code is wrong in the way you think.

Does it happen in another environment. If not, the difference between the environments is the bug, and you can stop reading the diff.

Does it happen every time. If not, it is timing or concurrency, which rules out most of the deterministic explanations you were about to test.

Three questions, a few minutes, and each answer eliminates a whole class of cause. Most of the time spent debugging is spent exploring a class that one of these would have ruled out immediately.

Keep the reproduction afterwards

The case you built to see the bug is the check that stops it coming back. Most teams delete it with the branch, which is why the same defect returns in six months and nobody recognizes it.

Terminal

npm install -g @testsprite/testsprite-cli
testsprite setup

The same setup is available in the TestSprite dashboard if you would rather not install anything locally. The rest of the CLI surface is in the CLI repository.

  • The GitHub App is a webhook you set up in the TestSprite dashboard. It listens for the deployment event your pipeline already produces, so nothing in your repository changes.

  • GitHub Actions puts the step inside your own workflow, configured from the terminal.

How TestSprite provides the missing step

It turns a reproduction into an artifact. You describe the sequence and what should be true at the end, and it runs against your deployed application and reports what actually happened. That is the step every other debugging tool assumes you already have.

Setup installs the verification skill into your coding agent, so it can produce and read that evidence itself rather than waiting for you to relay it. For an intermittent bug, running the same case repeatedly gives you a rate, which narrows the cause far faster than another hypothesis.

And the reproduction survives the fix. It stays in the project and runs on every change, so the same defect cannot quietly return once the branch is merged and the conversation is gone.

What is the most underrated debugging tool?

A written reproduction. It costs five minutes and makes everything else work.

How do I debug something intermittent?

Run the same sequence several times and record the rate. A one-in-four failure is usually timing or leftover state, which narrows it considerably.

Are logs enough?

They tell you what the code decided, not what the user experienced. The gap between those is where a lot of defects live.

Can an agent debug for me?

It can propose causes and fixes. It cannot observe the running application unless something gives it that ability, which is the step most setups are missing.

What should I do first with a new bug?

Reproduce it and write down the sequence. Everything after that is faster, including asking someone else for help.

The short version

The reproduction is the tool.

Debugging tools assume you can already trigger the failure, and getting there is where the time goes. Write the reproduction down, keep it after the fix, and give whoever fixes it the sequence and the divergence rather than a description.