<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Debugging on Brian Faust</title><link>https://wimdy.works/tags/debugging/</link><description>Recent content in Debugging on Brian Faust</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Mon, 01 Jan 0001 00:00:00 +0000</lastBuildDate><atom:link href="https://wimdy.works/tags/debugging/rss.xml" rel="self" type="application/rss+xml"/><item><title>Debugging Ends with an Explanation, Not a Green Build</title><link>https://wimdy.works/thoughts/debugging-ends-with-an-explanation-not-a-green-build/</link><pubDate>Thu, 01 Dec 2016 00:00:00 +0000</pubDate><guid>https://wimdy.works/thoughts/debugging-ends-with-an-explanation-not-a-green-build/</guid><description>&lt;p&gt;A cryptography-heavy application kept its CPUs near 100 percent. We found
several cryptographic paths worth improving, so the diagnosis felt obvious:
expensive mathematics was consuming the machine. How could logging possibly be
more expensive than the work the application existed to do?&lt;/p&gt;
&lt;p&gt;Then we measured the log stream. It was writing roughly a thousand lines per
second to local disk. We reduced the emitted logging without changing the
cryptographic work, and CPU use settled around 10–20 percent.&lt;/p&gt;</description></item><item><title>Test Cannot Prove Production When It Runs Different Rules</title><link>https://wimdy.works/thoughts/test-cannot-prove-production-when-it-runs-different-rules/</link><pubDate>Sat, 01 Oct 2016 00:00:00 +0000</pubDate><guid>https://wimdy.works/thoughts/test-cannot-prove-production-when-it-runs-different-rules/</guid><description>&lt;p&gt;A label-layout change passed in test and disrupted document distribution in
production. The same revision was deployed to both environments and the input
looked equivalent. Our test still could not predict what customers received.&lt;/p&gt;
&lt;p&gt;We had built that disagreement on purpose. Test loaded one default and
production loaded another because some users had never configured the layout
they wanted. The option existed; our environment branch kept compensating for
the omission. A new recommendation passed against the test rule while
production quietly ran a different product decision.&lt;/p&gt;</description></item><item><title>A Correlation Identifier Is a Boundary Contract</title><link>https://wimdy.works/thoughts/a-correlation-identifier-is-a-boundary-contract/</link><pubDate>Thu, 01 Sep 2016 00:00:00 +0000</pubDate><guid>https://wimdy.works/thoughts/a-correlation-identifier-is-a-boundary-contract/</guid><description>&lt;p&gt;We had logs everywhere and still could not follow one shipment through the
system. It had failed somewhere after payment and before its documents were
ready, but the application, queue worker, and remote adapter did not share an
identifier.&lt;/p&gt;
&lt;p&gt;The investigation started with timestamps, account details, and values which
looked related. Payment was plausible, as were several remote calls nearby.
Some trails took hours to disprove because they belonged to different requests
which happened at roughly the same time. We did not need more log lines. We
needed a chain of custody.&lt;/p&gt;</description></item><item><title>A Failure Timeline Can Eliminate the Best-Looking Suspect</title><link>https://wimdy.works/thoughts/a-failure-timeline-can-eliminate-the-best-looking-suspect/</link><pubDate>Fri, 01 Apr 2016 00:00:00 +0000</pubDate><guid>https://wimdy.works/thoughts/a-failure-timeline-can-eliminate-the-best-looking-suspect/</guid><description>&lt;p&gt;A shipment appeared in the local database without the tracking number or label
that made it useful. Payment was the first suspect because it was known to be
brittle, and the visible result looked like an operation which had stopped
halfway through.&lt;/p&gt;
&lt;p&gt;But payment had completed. The remote booking had completed too. The failure
happened while persisting the response, and a broad catch continued without
reporting it.&lt;/p&gt;
&lt;p&gt;Payment was guilty by reputation, not by the state in front of us. Ordering the
effects made that mismatch visible before another log line was added.&lt;/p&gt;</description></item><item><title>Production Bugs Can Live in the Data, Not the Code</title><link>https://wimdy.works/thoughts/production-bugs-can-live-in-the-data-not-the-code/</link><pubDate>Mon, 01 Feb 2016 00:00:00 +0000</pubDate><guid>https://wimdy.works/thoughts/production-bugs-can-live-in-the-data-not-the-code/</guid><description>&lt;p&gt;A delivery integration returned a label, but the application could not save
it. The same persistence path had passed with the fixtures used elsewhere.&lt;/p&gt;
&lt;p&gt;The failed label was not malformed. It was simply larger than the database
column could hold after Base64 encoding.&lt;/p&gt;
&lt;p&gt;That distinction changes the investigation. Comparing deployed revisions
would find nothing because the revision was not the variable. Repeating a
familiar fixture would also find nothing because the fixture did not cross the
same storage boundary. The investigation had treated “same code” as “same
experiment” while leaving the input that decided the result uncontrolled.&lt;/p&gt;</description></item><item><title>Reproduce the Failure Before Repairing It</title><link>https://wimdy.works/thoughts/reproduce-the-failure-before-repairing-it/</link><pubDate>Fri, 01 Jan 2016 00:00:00 +0000</pubDate><guid>https://wimdy.works/thoughts/reproduce-the-failure-before-repairing-it/</guid><description>&lt;p&gt;Submit two different browser error reports. The application accepts both
requests, sends both reports, and records the same tracing identifier for each.&lt;/p&gt;
&lt;p&gt;Nothing crashed during submission. No assertion failed. The defect appears
later, when someone searches the logs and finds two executions presented as
one trace.&lt;/p&gt;
&lt;p&gt;The tempting response is to replace the identifier generator immediately. The
collision already points in that direction. But a plausible diagnosis is not a
reproduction. Before changing the generator, we need a check which states what
was observed, what should differ, and which surrounding machinery does not
matter.&lt;/p&gt;</description></item></channel></rss>