<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><language>en</language><title>Blog posts by Mike</title> <link>https://world.optimizely.com/blogs/mike/</link><description></description><ttl>60</ttl><generator>Optimizely World</generator><item> <title>Remote Debugging in Optimizely DXP: What Is Actually Possible? </title>            <link>https://world.optimizely.com/blogs/mike/dates/2026/4/remote-debugging-in-optimizely-dxp-what-is-actually-possible-/</link>            <description>&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;
&lt;h3 class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;Introduction&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;At SYZYGY &lt;/span&gt;&lt;span class=&quot;NormalTextRun SpellingErrorV2Themed SCXW248700128 BCX8&quot;&gt;Techsolutions&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;, we support Optimizely DXP projects at scale, so continuously&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;identifying&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;the right tools and approaches for analyzing complex issues is an essential part of how we work.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP Selected SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;
&lt;p class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;At some point, most developers&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;encounter&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt; issues that are complex&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;to reproduce locally. Differences between local setup and other environments, variations in operating systems, and discrepancies in configuration or data all contribute to this gap.&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;While logs and telemetry provide valuable signals, they are inherently indirect. They rely on post&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;NoBreakHyphenBlob BlobObject DragDrop SCXW248700128 BCX8&quot;&gt;‑&lt;/span&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;hoc interpretation and selective instrumentation, which can make it difficult to fully understand execution flow and runtime behavior in a managed platform like Optimizely DXP.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP Selected SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;
&lt;p class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;This led to a question:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;Paragraph SCXW248700128 BCX8&quot; style=&quot;text-align: left; padding-left: 20pt;&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&lt;strong&gt;Can you remotely debug an application running in Optimizely DXP?&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;strong&gt;&lt;span class=&quot;EOP Selected SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;After going through official documentation, community discussions, and existing guides, I realized that the answer&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;isn&amp;rsquo;t&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;clearly documented. And&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;that&amp;rsquo;s&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;not accidental.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP Selected SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;
&lt;p class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;strong&gt;&lt;span class=&quot;NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW248700128 BCX8&quot;&gt;TL;DR&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;Based on this investigation, true remote debugging inside Optimizely DXP does not appear to be a supported workflow&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;This aligns with the nature of DXP as a managed Platform-as-a-Service (PaaS), where direct access to infrastructure and debugging capabilities is limited.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP Selected SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;
&lt;p class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;Still, the question&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;remains&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;relevant. For developers working with complex behavior,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;it&amp;rsquo;s&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;useful to understand&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;the boundaries&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;.&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;To get a clear picture, I approached this as a structured exploration. Instead of focusing on DXP directly, the investigation starts from the underlying platform it builds upon &amp;ndash; Azure App Services (Linux) &amp;ndash; and moves upward from there. This makes it possible to map what is available, how it behaves, and how those capabilities surface within a DXP environment&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;&lt;hr /&gt;
&lt;h3 class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;Why Remote Debugging Matters &amp;ndash; and Why&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;It&amp;rsquo;s&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt; So Hard in DXP&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;
&lt;p class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;Remote debugging is one of the most powerful &amp;ndash; yet often overlooked &amp;ndash; tools in a developer&amp;rsquo;s toolkit. Being able to attach a debugger to a live environment allows you to inspect variables, step through code paths, and diagnose elusive bugs that only manifest in production-like conditions. In traditional Azure App Service setups, remote debugging with tools like &lt;strong&gt;Visual Studio&lt;/strong&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW248700128 BCX8&quot;&gt;or&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&lt;strong&gt;JetBrains Rider&lt;/strong&gt;&amp;nbsp;is not only possible but well-documented.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP Selected SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;
&lt;p class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW248700128 BCX8&quot;&gt;Optimizely&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;DXP is a managed Platform-as-a-Service (PaaS) which prioritizes multiple layers of abstraction and a strong emphasis on security, compliance, and performance over infrastructure access.&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;In practice, DXP limits direct access to underlying app services, VM internals, and debugging endpoints.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;So what options are actually available &amp;ndash; and how far can you realistically go with them?&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP Selected SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr /&gt;
&lt;h3 class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;Remote Debugging Options &amp;ndash; Azure Web App (Linux) + .NET&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;
&lt;p class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;The Optimizely ecosystem runs on Linux containers, which means that tools like &lt;/span&gt;&lt;a title=&quot;Official Microsoft Documentation&quot; href=&quot;https://learn.microsoft.com/en-us/visualstudio/debugger/debug-live-azure-applications?view=vs-2022&quot;&gt;Snapshot Debugger&lt;/a&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;or&amp;nbsp;&lt;a title=&quot;Official Microsoft Documentation&quot; href=&quot;https://learn.microsoft.com/en-us/visualstudio/debugger/remote-debugging-azure-app-service?view=vs-2022&quot;&gt;Remote debugging on Azure App Services (Windows)&lt;/a&gt;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt; are simply not available. The alternative&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;we&#39;re&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt; left with is an &lt;a title=&quot;Official Microsoft Documentation&quot; href=&quot;https://learn.microsoft.com/en-us/visualstudio/debugger/remote-debugging-dotnet-core-linux-with-ssh?view=vs-2022&quot;&gt;SSH debugger&lt;/a&gt;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;. The referenced article explains how it works &amp;ndash; but since we aimed to explore every&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;viable&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;option&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;it&amp;rsquo;s&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;worth noting that both JetBrains Rider and Visual Studio support SSH-based debugging. They use slightly different configurations, but the idea is the same &amp;ndash;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;establish&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;a tunnel over a specific&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW248700128 BCX8&quot;&gt;port, and&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt; communicate bidirectionally about the execution process. Ideally, the deployed application should be built in Debug configuration (&lt;em&gt;&quot;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;dotnet build --configuration Debug&quot;&lt;/em&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt; and &quot;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;dotnet publish --configuration Debug&quot;&lt;/em&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;), so that symbol files &lt;em&gt;(&quot;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;.pdb&quot;&lt;/em&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;) are included &amp;ndash; enabling the debugger to accurately map execution to source code.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP Selected SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;
&lt;p class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;As an Optimizely Power User, you typically have access to three environments via the Azure Portal: Integration, Preproduction, and Production (sometimes also ADE1).&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;In my case, only the Integration environment exposed enough of the Web App&amp;rsquo;s configuration to investigate this directly. Since Preproduction and Production did not expose the Web App resource without Optimizely Support involvement, all debugging attempts focused on the Integration environment.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP Selected SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;
&lt;p class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;While &lt;a title=&quot;Official Microsoft Documentation&quot; href=&quot;https://learn.microsoft.com/en-us/azure/app-service/resources-kudu&quot;&gt;Kudu&lt;/a&gt; allows basic SSH access to the instance, enabling remote debugging requires &lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;establishing&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;an SSH tunnel from the local environment. Ideally, the tunnel should be managed by Azure and connect directly to the Optimizely DXP environment &amp;ndash; avoiding&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;firewall&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt; issues or potential security risks. Fortunately, Azure provides an out-of-the-box solution for this: &lt;a title=&quot;Official Microsoft Documentation&quot; href=&quot;https://learn.microsoft.com/en-us/azure/app-service/configure-linux-open-ssh-session?pivots=container-linux&quot;&gt;Open as SSH session to a container in Azure App&amp;nbsp;Service&lt;/a&gt;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;. The documentation clearly outlines the necessary steps. Just ensure the &lt;a title=&quot;Official Microsoft Documentation&quot; href=&quot;https://learn.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest&quot;&gt;Azure CLI is&amp;nbsp;installed&lt;/a&gt; &lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;and that&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;you&#39;ve&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt; run &quot;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;az login&quot;&lt;/em&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt; beforehand. Once you run &quot;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;az webapp create-remote-connection --subscription &amp;lt;subscription-id&amp;gt; --resource-group &amp;lt;resource-group-name&amp;gt; -n &amp;lt;app-name&amp;gt;&quot;&lt;/em&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;, the SSH tunnel to your instance will be active. Then, using your preferred SSH client, you can connect and gain shell access to the server &amp;ndash; just as described in the documentation.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;&lt;hr /&gt;&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;
&lt;h3 class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;Where the approach started to break down&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP Selected SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;
&lt;p class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;Encouraged by the successful SSH connection, I opened JetBrains Rider and&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;attempted&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;to &amp;ldquo;Attach to Remote Process&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;rdquo;.&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;After entering the local port of the SSH tunnel, I was prompted &amp;ndash; as expected &amp;ndash; with a message like &amp;ldquo;Your server&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;doesn&amp;rsquo;t&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;have the necessary files for debugging. Would you like to install them&lt;/span&gt;&lt;span class=&quot;NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW248700128 BCX8&quot;&gt;?&amp;rdquo;.&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;I clicked &amp;ldquo;Yes&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;rdquo;.&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;The debugger tools downloaded successfully &amp;ndash; but the installation failed after just 1-2 MB were transferred to the server. No clear exception was shown; Rider simply displayed the same prompt again. Multiple retries led nowhere, so I started investigating the issue more closely. It turned out Rider was&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;attempting&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt; to download and install the debugging tools by copying them over the SSH tunnel. The Kudu logs referenced a &quot;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;WebSocketException&quot;&amp;nbsp;&lt;/em&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;(&lt;em&gt;The remote party closed the WebSocket connection without completing the close &lt;/em&gt;&lt;/span&gt;&lt;span class=&quot;NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW248700128 BCX8&quot;&gt;&lt;em&gt;handshake.&lt;/em&gt;&lt;/span&gt;&lt;span class=&quot;NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW248700128 BCX8&quot;&gt;), but&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt; provided little else of value. I did confirm that Rider was uploading ZIP archives to the expected directory (&lt;em&gt;&quot;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;~/.local/share/JetBrains/RiderRemoteDebugger/...&quot;&lt;/em&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;), but only partially &amp;ndash; the file sizes were well below the 100MB+ expected for full debugger tools. Naturally, trying to unzip a partially downloaded archive failed. At that point, it became clear we had two options: either upload the debugger archive via &lt;em&gt;&quot;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;scp&quot;&lt;/em&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW248700128 BCX8&quot;&gt;, or&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt; download and install it directly from within the instance. Using &lt;em&gt;&quot;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;wget&quot;&lt;/em&gt;&amp;nbsp;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;was straightforward &amp;ndash; and it worked without issues.&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;I installed the Linux debugger tools matching the container architecture&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;(d&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;etails&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;a title=&quot;Official JetBrains Documentation&quot; href=&quot;https://www.jetbrains.com/help/rider/SSH_Remote_Debugging.html#-q06re1_143&quot;&gt;here&lt;/a&gt;) into the same directory where Rider had previously failed. The exact path may vary by Rider version, but&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;it&#39;s&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt; typically something like &lt;em&gt;&quot;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;~/.local/share/JetBrains/RiderRemoteDebugger/...&quot;&lt;/em&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;. After installing &lt;em&gt;&quot;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;unzip&quot;&lt;/em&gt; &lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;(&lt;em&gt;&quot;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;apt-get update &amp;amp;&amp;amp; apt-get install -y unzip&quot;&lt;/em&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;) and extracting the archive, I reached the&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;final step&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;: Rider was now able to list the running processes on the instance &amp;ndash; including my active .NET process.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP Selected SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;&lt;hr /&gt;
&lt;h3 class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;Next attempt &amp;ndash; a&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;nd&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;one more&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;discovery&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP Selected SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;
&lt;p class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;I clicked &lt;strong&gt;Attach&lt;/strong&gt;&amp;nbsp;again, however the same pattern reappeared: the connection was briefly&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;established&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;, then&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;immediately&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt; closed. Kudu logs once again showed a &lt;em&gt;&quot;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;WebSocketException&quot;&lt;/em&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;, prompting me to investigate potential issues with the SSH connection itself. I decided to retry the file upload using &lt;em&gt;&quot;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;scp&quot;&lt;/em&gt;&amp;nbsp;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;myself &amp;ndash; this time with verbose logging &amp;ndash; to better understand what was happening. I started small: uploading an empty &lt;em&gt;&quot;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;test.txt&quot;&lt;/em&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt; worked fine. A slightly larger file with a few lines of text &amp;ndash; also successful. But when &lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;attempting&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;to upload a larger file, I&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;encountered&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt; a familiar error: &lt;strong&gt;broken pipe&lt;/strong&gt;. This pointed toward a &lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;likely culprit&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;: some form of bandwidth limitation.&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW248700128 BCX8&quot;&gt;So&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt; I tried uploading the file with bandwidth throttling enabled:&lt;em&gt; &quot;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;scp&amp;nbsp;-vvv&amp;nbsp;-o MACs=hmac-sha1 -P &amp;lt;port&amp;gt; -l 8192 &quot;debugger-file.zip&quot;&amp;nbsp;root@127.0.0.1:~/.local/share/JetBrains/RiderRemoteDebugger/...&quot;&amp;nbsp;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;
&lt;p class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;That worked. My colleague and I reproduced the behavior on multiple machines, which made a purely client-side explanation less likely.&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;The remaining question was: how can we enforce the same throttling for JetBrains Rider&amp;rsquo;s automatic upload process?&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP Selected SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;
&lt;p class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;And&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;here&amp;rsquo;s&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;the tricky part: the SSH connection is managed by Azure, leaving little room for server-side customization. I briefly considered&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;terminating&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;the existing SSH server and launching a custom one with modified settings &amp;ndash; but OpenSSH&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;doesn&amp;rsquo;t&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;offer the necessary configuration flexibility, and interfering with the managed Azure/Optimizely infrastructure&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;wasn&amp;rsquo;t&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;a viable&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;option&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;. My next attempt involved using &lt;em&gt;&quot;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;tc&quot;&lt;/em&gt;&amp;nbsp;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;(traffic control) on the server to limit bandwidth, matching the constraint&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;I&amp;rsquo;d&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt; used with &lt;em&gt;&quot;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;scp&quot;&lt;/em&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;. However, even the&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;initial&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt; setup command &amp;ndash; &lt;em&gt;&quot;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;tc&amp;nbsp;qdisc&amp;nbsp;add dev $IFACE root handle 1:&amp;nbsp;htb default 30&quot;&lt;/em&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt; &amp;ndash; failed with a &lt;strong&gt;Permission &lt;/strong&gt;&lt;/span&gt;&lt;span class=&quot;NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW248700128 BCX8&quot;&gt;&lt;strong&gt;denied&lt;/strong&gt;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt; error. A quick check using &lt;em&gt;&quot;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;capsh&amp;nbsp;--print | grep&amp;nbsp;cap_net_admin&quot;&lt;/em&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;confirmed it: I&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;didn&amp;rsquo;t&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;have the required capabilities &amp;ndash; and that was the end of that path.&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;Realizing that tools like trickle or other ad hoc bandwidth limiters would&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;likely interfere&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;with the existing setup, I shifted focus&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;to throttling the connection from the client side. On Windows, I experimented with built-in QoS policies to throttle traffic &amp;ndash; but it&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;didn&amp;rsquo;t&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;help. Rider continued to disconnect shortly after starting the debugger, and the issue&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;remained&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP Selected SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;&lt;hr /&gt;&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;
&lt;h3 class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;Eliminating&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;concerns, or what else was tried&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP Selected SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;
&lt;p class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;1.&amp;nbsp;&lt;strong&gt;SFTP&lt;/strong&gt;. Some resources mention SFTP as a requirement for remote debugging, raising concerns about whether&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;it&amp;rsquo;s&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt; enabled in the Optimizely setup. It is. You can confirm this either in the Azure Portal or by running &lt;em&gt;&quot;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;grep sftp /etc/ssh/sshd_config&quot;&lt;/em&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;. Any output&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;indicates&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;it&amp;rsquo;s&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;active &amp;ndash; and&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;that&amp;rsquo;s&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;sufficient.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP Selected SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;
&lt;p class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;2. &lt;strong&gt;Release vs. Debug&amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;span class=&quot;NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW248700128 BCX8&quot;&gt;&lt;strong&gt;configurations.&lt;/strong&gt;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;I tested both build modes to rule out any mismatch &amp;ndash; same result in both cases. The issues persisted regardless of configuration.&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;That may have been the next problem if the SSH issue had been resolved, but I did not get far enough to prove it&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP Selected SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;
&lt;p class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;3. &lt;strong&gt;Azure&amp;rsquo;s &amp;ldquo;Remote Debugging Enabled&amp;rdquo;&amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;span class=&quot;NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW248700128 BCX8&quot;&gt;&lt;strong&gt;flag.&lt;/strong&gt;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;I did not find this useful for the .NET on Linux scenario tested here&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;In this setup,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;it was not applicable here and also interfered with SSH access, as both rely on port&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW248700128 BCX8&quot;&gt;2222&lt;/span&gt;&lt;span class=&quot;NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW248700128 BCX8&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt; Still, if you want to experiment, you can toggle it using the following commands: &lt;em&gt;&quot;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;az webapp config set --resource-group &amp;lt;resource-group&amp;gt; -n &amp;lt;webapp-name&amp;gt; --remote-debugging-enabled=true&quot; &lt;/em&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;and to roll-back&lt;em&gt; &quot;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;az webapp config set --resource-group &amp;lt;resource-group&amp;gt; -n &amp;lt;webapp-name&amp;gt; --remote-debugging-enabled=false&quot;&lt;/em&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;. Even if not useful for this scenario, the output of these commands is worth exploring &amp;ndash; Azure exposes a surprisingly rich ARM definition of your Web App.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP Selected SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;
&lt;p class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;4. &lt;strong&gt;What about Visual&amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;span class=&quot;NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW248700128 BCX8&quot;&gt;&lt;strong&gt;Studio?&lt;/strong&gt;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;As expected, I&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;gave it a try&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&amp;ndash; but the results were even worse. Visual Studio refused the SSH connection entirely and exited with the&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW248700128 BCX8&quot;&gt;message:&amp;nbsp;&lt;/span&gt;&lt;em&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&quot;Connectivity Failure: Please make sure host name and port number are correct&lt;/span&gt;&lt;/em&gt;&lt;span class=&quot;NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW248700128 BCX8&quot;&gt;&lt;em&gt;.&quot;&lt;/em&gt;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;No&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;additional&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;context was provided, leaving me guessing what might&amp;rsquo;ve gone wrong&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;Throughout this process, I&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;monitored&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;Kudu logs in parallel. While some error entries did appear, they&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;weren&amp;rsquo;t&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt; particularly helpful &amp;ndash; mostly the same &lt;em&gt;&quot;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;WebSocketException&quot;&amp;nbsp;&lt;/em&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;patterns I saw when using Rider. One thing was clear: Visual Studio recognized the SSH tunnel. When another connection was already active, it would wait and only fail once the other connection was released &amp;ndash; confirming awareness of the underlying channel, even if it&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;couldn&amp;rsquo;t&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;use it properly.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;
&lt;p class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;5. &lt;strong&gt;Limit bandwidth from Rider&amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;span class=&quot;NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW248700128 BCX8&quot;&gt;&lt;strong&gt;directly?&lt;/strong&gt;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;I checked&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;Rider&amp;rsquo;s&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;available&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW248700128 BCX8&quot;&gt;settings, but&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;found no built-in way to throttle the SSH transfer rate.&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;It&amp;rsquo;s&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;possible that using a proxy or a more advanced traffic-shaping setup could help &amp;ndash; but investigating that path would take&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;considerably more&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;time, with no guaranteed payoff. At this point, I made&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW248700128 BCX8&quot;&gt;the&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;call to stop here.&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt; Remaining options required more time with no clear path to a reliable result.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr /&gt;
&lt;h3 class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;Final Observations&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;
&lt;p class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;I&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;attempted&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;to connect to the instance&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;overnight, when&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;I expected activity in Integration to be minimal.&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;Interestingly, the debugger connection held for nearly 10 seconds, longer than any of the daytime attempts, before ultimately failing again.&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;Bandwidth-related limits or instability seem like the most plausible explanation from these tests, though I could not prove that definitively or&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;rule out other&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;blockers&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP Selected SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;
&lt;p class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;At this point,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;it&amp;rsquo;s&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;worth stepping back and looking at the outcome&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;more practically&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP Selected SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;
&lt;p class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW248700128 BCX8&quot;&gt;Optimizely&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;DXP is a managed platform, and remote debugging is not a workflow it currently exposes or documents directly&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;. That makes the result expected &amp;ndash; but the path to that understanding is not always obvious when you start.&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;For developers working with complex systems, the question itself still comes up. This exploration&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;doesn&amp;rsquo;t&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;change the&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW248700128 BCX8&quot;&gt;platform&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;behavior, but it does make the current boundaries clearer: what can be&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;attempted&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;, what partially works, and where things start to break down in practice.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP Selected SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW248700128 BCX8&quot;&gt;
&lt;p class=&quot;Paragraph SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;TextRun SCXW248700128 BCX8&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;If nothing else, this should save time for anyone approaching the same&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;idea&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt; &amp;ndash; and provide a more concrete starting point&lt;/span&gt;&lt;span class=&quot;NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW248700128 BCX8&quot;&gt;, should&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;&amp;nbsp;you decide to take it&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW248700128 BCX8&quot;&gt;further.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP Selected SCXW248700128 BCX8&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;</description>            <guid>https://world.optimizely.com/blogs/mike/dates/2026/4/remote-debugging-in-optimizely-dxp-what-is-actually-possible-/</guid>            <pubDate>Mon, 20 Apr 2026 08:45:18 GMT</pubDate>           <category>Blog post</category></item></channel>
</rss>