Skip to content

Set MSBUILDDEBUGPATH in common build scripts for crash diagnostics - #16715

Merged
danmoseley merged 1 commit into
dotnet:mainfrom
danmoseley:arcade-msbuilddebugpath
Apr 14, 2026
Merged

Set MSBUILDDEBUGPATH in common build scripts for crash diagnostics#16715
danmoseley merged 1 commit into
dotnet:mainfrom
danmoseley:arcade-msbuilddebugpath

Conversation

@danmoseley

@danmoseleydanmoseley commented Apr 14, 2026

Copy link
Copy Markdown

When MSBuild encounters a fatal internal error (MSB4166), it writes a failure.txt crash dump file. By default these go to the system temp directory, which CI pipelines typically don't collect as artifacts — making it hard to diagnose intermittent MSBuild crashes in CI.

This change sets MSBUILDDEBUGPATH in arcade's common build scripts (tools.sh and tools.ps1) to direct these crash diagnostics to artifacts/log/<configuration>/MsbuildDebugLogs/, which is already collected by CI pipelines.

Key design choices:

  • Guarded: only sets MSBUILDDEBUGPATH if it isn't already defined, so repo-specific or user overrides are respected
  • No explicit mkdir: MSBuild's FrameworkDebugUtils.SetDebugPath() creates the directory itself inside a try/catch when needed, avoiding set -e risk in bash and keeping the change minimal
  • No disk bloat: without MSBUILDDEBUGENGINE=1, only crash dump files are written here (not verbose debug/scheduler logs), so the directory will be empty on healthy builds
  • Unconditional (not CI-only): crash diagnostics are useful for local debugging too, and since only crash files land here, there's no performance or disk concern

Several repos (e.g., dotnet/runtime) already set MSBUILDDEBUGPATH in their own build scripts for specific subcomponents. This change provides the default for all arcade-based repos, filling the gap for top-level builds.

Relates to getting data to fixdotnet/runtime#92290 and any other MSBuild crashes in any arcade repos
Supersedes dotnet/runtime#126806

Set MSBUILDDEBUGPATH in eng/common/tools.sh and eng/common/tools.ps1 so that
MSBuild crash diagnostics (MSB4166 failure.txt files) are written to a known
location under artifacts/log/<config>/MsbuildDebugLogs/ instead of the system
temp directory. This ensures they are captured as build artifacts in CI.
Previously individual repos had to set this in their own build scripts (e.g.
dotnet/runtime's src/coreclr/build-runtime.sh, src/tests/build.sh). Putting
it in the common tooling covers all repos using arcade infrastructure.
Relates to dotnet/runtime#92290
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR improves MSBuild crash diagnostics collection by defaulting MSBUILDDEBUGPATH in Arcade’s shared build tooling to a location under artifacts/log/<configuration>/, which CI already publishes as an artifact—making MSB4166 “failure.txt” outputs available for postmortem analysis.

Changes:

  • Set MSBUILDDEBUGPATH (only if not already defined) in eng/common/tools.sh.
  • Set MSBUILDDEBUGPATH (only if not already defined) in eng/common/tools.ps1.
  • Route MSBuild crash diagnostics to artifacts/log/<configuration>/MsbuildDebugLogs/.
Show a summary per file
FileDescription
eng/common/tools.shExports MSBUILDDEBUGPATH to a stable artifacts log subdirectory when unset.
eng/common/tools.ps1Sets $env:MSBUILDDEBUGPATH to a stable artifacts log subdirectory when unset.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 0

@danmoseley
danmoseley requested a review from hoyosjsApril 14, 2026 15:03
Comment threadeng/common/tools.ps1
# Direct MSBuild crash diagnostics (MSB4166 failure.txt files) to a known location
# under artifacts/log so they are captured as build artifacts in CI.
if (-not $env:MSBUILDDEBUGPATH) {
$env:MSBUILDDEBUGPATH = Join-Path $LogDir 'MsbuildDebugLogs'

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This also collects them on dev machines - I am not against that anyway.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes and I think that's a good thing.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

MSBuild crashing in the build

3 participants

@danmoseley@hoyosjs
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Set MSBUILDDEBUGPATH in common build scripts for crash diagnostics by danmoseley · Pull Request #16715 · dotnet/arcade · GitHub
Skip to content

Set MSBUILDDEBUGPATH in common build scripts for crash diagnostics - #16715

Merged
danmoseley merged 1 commit into
dotnet:mainfrom
danmoseley:arcade-msbuilddebugpath
Apr 14, 2026
Merged

Set MSBUILDDEBUGPATH in common build scripts for crash diagnostics#16715
danmoseley merged 1 commit into
dotnet:mainfrom
danmoseley:arcade-msbuilddebugpath

Conversation

@danmoseley

@danmoseleydanmoseley commented Apr 14, 2026

Copy link
Copy Markdown

When MSBuild encounters a fatal internal error (MSB4166), it writes a failure.txt crash dump file. By default these go to the system temp directory, which CI pipelines typically don't collect as artifacts — making it hard to diagnose intermittent MSBuild crashes in CI.

This change sets MSBUILDDEBUGPATH in arcade's common build scripts (tools.sh and tools.ps1) to direct these crash diagnostics to artifacts/log/<configuration>/MsbuildDebugLogs/, which is already collected by CI pipelines.

Key design choices:

  • Guarded: only sets MSBUILDDEBUGPATH if it isn't already defined, so repo-specific or user overrides are respected
  • No explicit mkdir: MSBuild's FrameworkDebugUtils.SetDebugPath() creates the directory itself inside a try/catch when needed, avoiding set -e risk in bash and keeping the change minimal
  • No disk bloat: without MSBUILDDEBUGENGINE=1, only crash dump files are written here (not verbose debug/scheduler logs), so the directory will be empty on healthy builds
  • Unconditional (not CI-only): crash diagnostics are useful for local debugging too, and since only crash files land here, there's no performance or disk concern

Several repos (e.g., dotnet/runtime) already set MSBUILDDEBUGPATH in their own build scripts for specific subcomponents. This change provides the default for all arcade-based repos, filling the gap for top-level builds.

Relates to getting data to fixdotnet/runtime#92290 and any other MSBuild crashes in any arcade repos
Supersedes dotnet/runtime#126806

Set MSBUILDDEBUGPATH in eng/common/tools.sh and eng/common/tools.ps1 so that
MSBuild crash diagnostics (MSB4166 failure.txt files) are written to a known
location under artifacts/log/<config>/MsbuildDebugLogs/ instead of the system
temp directory. This ensures they are captured as build artifacts in CI.
Previously individual repos had to set this in their own build scripts (e.g.
dotnet/runtime's src/coreclr/build-runtime.sh, src/tests/build.sh). Putting
it in the common tooling covers all repos using arcade infrastructure.
Relates to dotnet/runtime#92290
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR improves MSBuild crash diagnostics collection by defaulting MSBUILDDEBUGPATH in Arcade’s shared build tooling to a location under artifacts/log/<configuration>/, which CI already publishes as an artifact—making MSB4166 “failure.txt” outputs available for postmortem analysis.

Changes:

  • Set MSBUILDDEBUGPATH (only if not already defined) in eng/common/tools.sh.
  • Set MSBUILDDEBUGPATH (only if not already defined) in eng/common/tools.ps1.
  • Route MSBuild crash diagnostics to artifacts/log/<configuration>/MsbuildDebugLogs/.
Show a summary per file
FileDescription
eng/common/tools.shExports MSBUILDDEBUGPATH to a stable artifacts log subdirectory when unset.
eng/common/tools.ps1Sets $env:MSBUILDDEBUGPATH to a stable artifacts log subdirectory when unset.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 0

@danmoseley
danmoseley requested a review from hoyosjsApril 14, 2026 15:03
Comment threadeng/common/tools.ps1
# Direct MSBuild crash diagnostics (MSB4166 failure.txt files) to a known location
# under artifacts/log so they are captured as build artifacts in CI.
if (-not $env:MSBUILDDEBUGPATH) {
$env:MSBUILDDEBUGPATH = Join-Path $LogDir 'MsbuildDebugLogs'

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This also collects them on dev machines - I am not against that anyway.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes and I think that's a good thing.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

MSBuild crashing in the build

3 participants

@danmoseley@hoyosjs
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Set MSBUILDDEBUGPATH in common build scripts for crash diagnostics by danmoseley · Pull Request #16715 · dotnet/arcade · GitHub
Skip to content

Set MSBUILDDEBUGPATH in common build scripts for crash diagnostics - #16715

Merged
danmoseley merged 1 commit into
dotnet:mainfrom
danmoseley:arcade-msbuilddebugpath
Apr 14, 2026
Merged

Set MSBUILDDEBUGPATH in common build scripts for crash diagnostics#16715
danmoseley merged 1 commit into
dotnet:mainfrom
danmoseley:arcade-msbuilddebugpath

Conversation

@danmoseley

@danmoseleydanmoseley commented Apr 14, 2026

Copy link
Copy Markdown

When MSBuild encounters a fatal internal error (MSB4166), it writes a failure.txt crash dump file. By default these go to the system temp directory, which CI pipelines typically don't collect as artifacts — making it hard to diagnose intermittent MSBuild crashes in CI.

This change sets MSBUILDDEBUGPATH in arcade's common build scripts (tools.sh and tools.ps1) to direct these crash diagnostics to artifacts/log/<configuration>/MsbuildDebugLogs/, which is already collected by CI pipelines.

Key design choices:

  • Guarded: only sets MSBUILDDEBUGPATH if it isn't already defined, so repo-specific or user overrides are respected
  • No explicit mkdir: MSBuild's FrameworkDebugUtils.SetDebugPath() creates the directory itself inside a try/catch when needed, avoiding set -e risk in bash and keeping the change minimal
  • No disk bloat: without MSBUILDDEBUGENGINE=1, only crash dump files are written here (not verbose debug/scheduler logs), so the directory will be empty on healthy builds
  • Unconditional (not CI-only): crash diagnostics are useful for local debugging too, and since only crash files land here, there's no performance or disk concern

Several repos (e.g., dotnet/runtime) already set MSBUILDDEBUGPATH in their own build scripts for specific subcomponents. This change provides the default for all arcade-based repos, filling the gap for top-level builds.

Relates to getting data to fixdotnet/runtime#92290 and any other MSBuild crashes in any arcade repos
Supersedes dotnet/runtime#126806

Set MSBUILDDEBUGPATH in eng/common/tools.sh and eng/common/tools.ps1 so that
MSBuild crash diagnostics (MSB4166 failure.txt files) are written to a known
location under artifacts/log/<config>/MsbuildDebugLogs/ instead of the system
temp directory. This ensures they are captured as build artifacts in CI.
Previously individual repos had to set this in their own build scripts (e.g.
dotnet/runtime's src/coreclr/build-runtime.sh, src/tests/build.sh). Putting
it in the common tooling covers all repos using arcade infrastructure.
Relates to dotnet/runtime#92290
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR improves MSBuild crash diagnostics collection by defaulting MSBUILDDEBUGPATH in Arcade’s shared build tooling to a location under artifacts/log/<configuration>/, which CI already publishes as an artifact—making MSB4166 “failure.txt” outputs available for postmortem analysis.

Changes:

  • Set MSBUILDDEBUGPATH (only if not already defined) in eng/common/tools.sh.
  • Set MSBUILDDEBUGPATH (only if not already defined) in eng/common/tools.ps1.
  • Route MSBuild crash diagnostics to artifacts/log/<configuration>/MsbuildDebugLogs/.
Show a summary per file
FileDescription
eng/common/tools.shExports MSBUILDDEBUGPATH to a stable artifacts log subdirectory when unset.
eng/common/tools.ps1Sets $env:MSBUILDDEBUGPATH to a stable artifacts log subdirectory when unset.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 0

@danmoseley
danmoseley requested a review from hoyosjsApril 14, 2026 15:03
Comment threadeng/common/tools.ps1
# Direct MSBuild crash diagnostics (MSB4166 failure.txt files) to a known location
# under artifacts/log so they are captured as build artifacts in CI.
if (-not $env:MSBUILDDEBUGPATH) {
$env:MSBUILDDEBUGPATH = Join-Path $LogDir 'MsbuildDebugLogs'

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This also collects them on dev machines - I am not against that anyway.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes and I think that's a good thing.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

MSBuild crashing in the build

3 participants

@danmoseley@hoyosjs
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Set MSBUILDDEBUGPATH in common build scripts for crash diagnostics by danmoseley · Pull Request #16715 · dotnet/arcade · GitHub
Skip to content

Set MSBUILDDEBUGPATH in common build scripts for crash diagnostics - #16715

Merged
danmoseley merged 1 commit into
dotnet:mainfrom
danmoseley:arcade-msbuilddebugpath
Apr 14, 2026
Merged

Set MSBUILDDEBUGPATH in common build scripts for crash diagnostics#16715
danmoseley merged 1 commit into
dotnet:mainfrom
danmoseley:arcade-msbuilddebugpath

Conversation

@danmoseley

@danmoseleydanmoseley commented Apr 14, 2026

Copy link
Copy Markdown

When MSBuild encounters a fatal internal error (MSB4166), it writes a failure.txt crash dump file. By default these go to the system temp directory, which CI pipelines typically don't collect as artifacts — making it hard to diagnose intermittent MSBuild crashes in CI.

This change sets MSBUILDDEBUGPATH in arcade's common build scripts (tools.sh and tools.ps1) to direct these crash diagnostics to artifacts/log/<configuration>/MsbuildDebugLogs/, which is already collected by CI pipelines.

Key design choices:

  • Guarded: only sets MSBUILDDEBUGPATH if it isn't already defined, so repo-specific or user overrides are respected
  • No explicit mkdir: MSBuild's FrameworkDebugUtils.SetDebugPath() creates the directory itself inside a try/catch when needed, avoiding set -e risk in bash and keeping the change minimal
  • No disk bloat: without MSBUILDDEBUGENGINE=1, only crash dump files are written here (not verbose debug/scheduler logs), so the directory will be empty on healthy builds
  • Unconditional (not CI-only): crash diagnostics are useful for local debugging too, and since only crash files land here, there's no performance or disk concern

Several repos (e.g., dotnet/runtime) already set MSBUILDDEBUGPATH in their own build scripts for specific subcomponents. This change provides the default for all arcade-based repos, filling the gap for top-level builds.

Relates to getting data to fixdotnet/runtime#92290 and any other MSBuild crashes in any arcade repos
Supersedes dotnet/runtime#126806

Set MSBUILDDEBUGPATH in eng/common/tools.sh and eng/common/tools.ps1 so that
MSBuild crash diagnostics (MSB4166 failure.txt files) are written to a known
location under artifacts/log/<config>/MsbuildDebugLogs/ instead of the system
temp directory. This ensures they are captured as build artifacts in CI.
Previously individual repos had to set this in their own build scripts (e.g.
dotnet/runtime's src/coreclr/build-runtime.sh, src/tests/build.sh). Putting
it in the common tooling covers all repos using arcade infrastructure.
Relates to dotnet/runtime#92290
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR improves MSBuild crash diagnostics collection by defaulting MSBUILDDEBUGPATH in Arcade’s shared build tooling to a location under artifacts/log/<configuration>/, which CI already publishes as an artifact—making MSB4166 “failure.txt” outputs available for postmortem analysis.

Changes:

  • Set MSBUILDDEBUGPATH (only if not already defined) in eng/common/tools.sh.
  • Set MSBUILDDEBUGPATH (only if not already defined) in eng/common/tools.ps1.
  • Route MSBuild crash diagnostics to artifacts/log/<configuration>/MsbuildDebugLogs/.
Show a summary per file
FileDescription
eng/common/tools.shExports MSBUILDDEBUGPATH to a stable artifacts log subdirectory when unset.
eng/common/tools.ps1Sets $env:MSBUILDDEBUGPATH to a stable artifacts log subdirectory when unset.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 0

@danmoseley
danmoseley requested a review from hoyosjsApril 14, 2026 15:03
Comment threadeng/common/tools.ps1
# Direct MSBuild crash diagnostics (MSB4166 failure.txt files) to a known location
# under artifacts/log so they are captured as build artifacts in CI.
if (-not $env:MSBUILDDEBUGPATH) {
$env:MSBUILDDEBUGPATH = Join-Path $LogDir 'MsbuildDebugLogs'

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This also collects them on dev machines - I am not against that anyway.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes and I think that's a good thing.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

MSBuild crashing in the build

3 participants

@danmoseley@hoyosjs
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Set MSBUILDDEBUGPATH in common build scripts for crash diagnostics by danmoseley · Pull Request #16715 · dotnet/arcade · GitHub
Skip to content

Set MSBUILDDEBUGPATH in common build scripts for crash diagnostics - #16715

Merged
danmoseley merged 1 commit into
dotnet:mainfrom
danmoseley:arcade-msbuilddebugpath
Apr 14, 2026
Merged

Set MSBUILDDEBUGPATH in common build scripts for crash diagnostics#16715
danmoseley merged 1 commit into
dotnet:mainfrom
danmoseley:arcade-msbuilddebugpath

Conversation

@danmoseley

@danmoseleydanmoseley commented Apr 14, 2026

Copy link
Copy Markdown

When MSBuild encounters a fatal internal error (MSB4166), it writes a failure.txt crash dump file. By default these go to the system temp directory, which CI pipelines typically don't collect as artifacts — making it hard to diagnose intermittent MSBuild crashes in CI.

This change sets MSBUILDDEBUGPATH in arcade's common build scripts (tools.sh and tools.ps1) to direct these crash diagnostics to artifacts/log/<configuration>/MsbuildDebugLogs/, which is already collected by CI pipelines.

Key design choices:

  • Guarded: only sets MSBUILDDEBUGPATH if it isn't already defined, so repo-specific or user overrides are respected
  • No explicit mkdir: MSBuild's FrameworkDebugUtils.SetDebugPath() creates the directory itself inside a try/catch when needed, avoiding set -e risk in bash and keeping the change minimal
  • No disk bloat: without MSBUILDDEBUGENGINE=1, only crash dump files are written here (not verbose debug/scheduler logs), so the directory will be empty on healthy builds
  • Unconditional (not CI-only): crash diagnostics are useful for local debugging too, and since only crash files land here, there's no performance or disk concern

Several repos (e.g., dotnet/runtime) already set MSBUILDDEBUGPATH in their own build scripts for specific subcomponents. This change provides the default for all arcade-based repos, filling the gap for top-level builds.

Relates to getting data to fixdotnet/runtime#92290 and any other MSBuild crashes in any arcade repos
Supersedes dotnet/runtime#126806

Set MSBUILDDEBUGPATH in eng/common/tools.sh and eng/common/tools.ps1 so that
MSBuild crash diagnostics (MSB4166 failure.txt files) are written to a known
location under artifacts/log/<config>/MsbuildDebugLogs/ instead of the system
temp directory. This ensures they are captured as build artifacts in CI.
Previously individual repos had to set this in their own build scripts (e.g.
dotnet/runtime's src/coreclr/build-runtime.sh, src/tests/build.sh). Putting
it in the common tooling covers all repos using arcade infrastructure.
Relates to dotnet/runtime#92290
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR improves MSBuild crash diagnostics collection by defaulting MSBUILDDEBUGPATH in Arcade’s shared build tooling to a location under artifacts/log/<configuration>/, which CI already publishes as an artifact—making MSB4166 “failure.txt” outputs available for postmortem analysis.

Changes:

  • Set MSBUILDDEBUGPATH (only if not already defined) in eng/common/tools.sh.
  • Set MSBUILDDEBUGPATH (only if not already defined) in eng/common/tools.ps1.
  • Route MSBuild crash diagnostics to artifacts/log/<configuration>/MsbuildDebugLogs/.
Show a summary per file
FileDescription
eng/common/tools.shExports MSBUILDDEBUGPATH to a stable artifacts log subdirectory when unset.
eng/common/tools.ps1Sets $env:MSBUILDDEBUGPATH to a stable artifacts log subdirectory when unset.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 0

@danmoseley
danmoseley requested a review from hoyosjsApril 14, 2026 15:03
Comment threadeng/common/tools.ps1
# Direct MSBuild crash diagnostics (MSB4166 failure.txt files) to a known location
# under artifacts/log so they are captured as build artifacts in CI.
if (-not $env:MSBUILDDEBUGPATH) {
$env:MSBUILDDEBUGPATH = Join-Path $LogDir 'MsbuildDebugLogs'

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This also collects them on dev machines - I am not against that anyway.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes and I think that's a good thing.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

MSBuild crashing in the build

3 participants

@danmoseley@hoyosjs
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Set MSBUILDDEBUGPATH in common build scripts for crash diagnostics by danmoseley · Pull Request #16715 · dotnet/arcade · GitHub
Skip to content

Set MSBUILDDEBUGPATH in common build scripts for crash diagnostics - #16715

Merged
danmoseley merged 1 commit into
dotnet:mainfrom
danmoseley:arcade-msbuilddebugpath
Apr 14, 2026
Merged

Set MSBUILDDEBUGPATH in common build scripts for crash diagnostics#16715
danmoseley merged 1 commit into
dotnet:mainfrom
danmoseley:arcade-msbuilddebugpath

Conversation

@danmoseley

@danmoseleydanmoseley commented Apr 14, 2026

Copy link
Copy Markdown

When MSBuild encounters a fatal internal error (MSB4166), it writes a failure.txt crash dump file. By default these go to the system temp directory, which CI pipelines typically don't collect as artifacts — making it hard to diagnose intermittent MSBuild crashes in CI.

This change sets MSBUILDDEBUGPATH in arcade's common build scripts (tools.sh and tools.ps1) to direct these crash diagnostics to artifacts/log/<configuration>/MsbuildDebugLogs/, which is already collected by CI pipelines.

Key design choices:

  • Guarded: only sets MSBUILDDEBUGPATH if it isn't already defined, so repo-specific or user overrides are respected
  • No explicit mkdir: MSBuild's FrameworkDebugUtils.SetDebugPath() creates the directory itself inside a try/catch when needed, avoiding set -e risk in bash and keeping the change minimal
  • No disk bloat: without MSBUILDDEBUGENGINE=1, only crash dump files are written here (not verbose debug/scheduler logs), so the directory will be empty on healthy builds
  • Unconditional (not CI-only): crash diagnostics are useful for local debugging too, and since only crash files land here, there's no performance or disk concern

Several repos (e.g., dotnet/runtime) already set MSBUILDDEBUGPATH in their own build scripts for specific subcomponents. This change provides the default for all arcade-based repos, filling the gap for top-level builds.

Relates to getting data to fixdotnet/runtime#92290 and any other MSBuild crashes in any arcade repos
Supersedes dotnet/runtime#126806

Set MSBUILDDEBUGPATH in eng/common/tools.sh and eng/common/tools.ps1 so that
MSBuild crash diagnostics (MSB4166 failure.txt files) are written to a known
location under artifacts/log/<config>/MsbuildDebugLogs/ instead of the system
temp directory. This ensures they are captured as build artifacts in CI.
Previously individual repos had to set this in their own build scripts (e.g.
dotnet/runtime's src/coreclr/build-runtime.sh, src/tests/build.sh). Putting
it in the common tooling covers all repos using arcade infrastructure.
Relates to dotnet/runtime#92290
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR improves MSBuild crash diagnostics collection by defaulting MSBUILDDEBUGPATH in Arcade’s shared build tooling to a location under artifacts/log/<configuration>/, which CI already publishes as an artifact—making MSB4166 “failure.txt” outputs available for postmortem analysis.

Changes:

  • Set MSBUILDDEBUGPATH (only if not already defined) in eng/common/tools.sh.
  • Set MSBUILDDEBUGPATH (only if not already defined) in eng/common/tools.ps1.
  • Route MSBuild crash diagnostics to artifacts/log/<configuration>/MsbuildDebugLogs/.
Show a summary per file
FileDescription
eng/common/tools.shExports MSBUILDDEBUGPATH to a stable artifacts log subdirectory when unset.
eng/common/tools.ps1Sets $env:MSBUILDDEBUGPATH to a stable artifacts log subdirectory when unset.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 0

@danmoseley
danmoseley requested a review from hoyosjsApril 14, 2026 15:03
Comment threadeng/common/tools.ps1
# Direct MSBuild crash diagnostics (MSB4166 failure.txt files) to a known location
# under artifacts/log so they are captured as build artifacts in CI.
if (-not $env:MSBUILDDEBUGPATH) {
$env:MSBUILDDEBUGPATH = Join-Path $LogDir 'MsbuildDebugLogs'

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This also collects them on dev machines - I am not against that anyway.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes and I think that's a good thing.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

MSBuild crashing in the build

3 participants

@danmoseley@hoyosjs
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Set MSBUILDDEBUGPATH in common build scripts for crash diagnostics by danmoseley · Pull Request #16715 · dotnet/arcade · GitHub
Skip to content

Set MSBUILDDEBUGPATH in common build scripts for crash diagnostics - #16715

Merged
danmoseley merged 1 commit into
dotnet:mainfrom
danmoseley:arcade-msbuilddebugpath
Apr 14, 2026
Merged

Set MSBUILDDEBUGPATH in common build scripts for crash diagnostics#16715
danmoseley merged 1 commit into
dotnet:mainfrom
danmoseley:arcade-msbuilddebugpath

Conversation

@danmoseley

@danmoseleydanmoseley commented Apr 14, 2026

Copy link
Copy Markdown

When MSBuild encounters a fatal internal error (MSB4166), it writes a failure.txt crash dump file. By default these go to the system temp directory, which CI pipelines typically don't collect as artifacts — making it hard to diagnose intermittent MSBuild crashes in CI.

This change sets MSBUILDDEBUGPATH in arcade's common build scripts (tools.sh and tools.ps1) to direct these crash diagnostics to artifacts/log/<configuration>/MsbuildDebugLogs/, which is already collected by CI pipelines.

Key design choices:

  • Guarded: only sets MSBUILDDEBUGPATH if it isn't already defined, so repo-specific or user overrides are respected
  • No explicit mkdir: MSBuild's FrameworkDebugUtils.SetDebugPath() creates the directory itself inside a try/catch when needed, avoiding set -e risk in bash and keeping the change minimal
  • No disk bloat: without MSBUILDDEBUGENGINE=1, only crash dump files are written here (not verbose debug/scheduler logs), so the directory will be empty on healthy builds
  • Unconditional (not CI-only): crash diagnostics are useful for local debugging too, and since only crash files land here, there's no performance or disk concern

Several repos (e.g., dotnet/runtime) already set MSBUILDDEBUGPATH in their own build scripts for specific subcomponents. This change provides the default for all arcade-based repos, filling the gap for top-level builds.

Relates to getting data to fixdotnet/runtime#92290 and any other MSBuild crashes in any arcade repos
Supersedes dotnet/runtime#126806

Set MSBUILDDEBUGPATH in eng/common/tools.sh and eng/common/tools.ps1 so that
MSBuild crash diagnostics (MSB4166 failure.txt files) are written to a known
location under artifacts/log/<config>/MsbuildDebugLogs/ instead of the system
temp directory. This ensures they are captured as build artifacts in CI.
Previously individual repos had to set this in their own build scripts (e.g.
dotnet/runtime's src/coreclr/build-runtime.sh, src/tests/build.sh). Putting
it in the common tooling covers all repos using arcade infrastructure.
Relates to dotnet/runtime#92290
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR improves MSBuild crash diagnostics collection by defaulting MSBUILDDEBUGPATH in Arcade’s shared build tooling to a location under artifacts/log/<configuration>/, which CI already publishes as an artifact—making MSB4166 “failure.txt” outputs available for postmortem analysis.

Changes:

  • Set MSBUILDDEBUGPATH (only if not already defined) in eng/common/tools.sh.
  • Set MSBUILDDEBUGPATH (only if not already defined) in eng/common/tools.ps1.
  • Route MSBuild crash diagnostics to artifacts/log/<configuration>/MsbuildDebugLogs/.
Show a summary per file
FileDescription
eng/common/tools.shExports MSBUILDDEBUGPATH to a stable artifacts log subdirectory when unset.
eng/common/tools.ps1Sets $env:MSBUILDDEBUGPATH to a stable artifacts log subdirectory when unset.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 0

@danmoseley
danmoseley requested a review from hoyosjsApril 14, 2026 15:03
Comment threadeng/common/tools.ps1
# Direct MSBuild crash diagnostics (MSB4166 failure.txt files) to a known location
# under artifacts/log so they are captured as build artifacts in CI.
if (-not $env:MSBUILDDEBUGPATH) {
$env:MSBUILDDEBUGPATH = Join-Path $LogDir 'MsbuildDebugLogs'

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This also collects them on dev machines - I am not against that anyway.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes and I think that's a good thing.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

MSBuild crashing in the build

3 participants

@danmoseley@hoyosjs
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Set MSBUILDDEBUGPATH in common build scripts for crash diagnostics by danmoseley · Pull Request #16715 · dotnet/arcade · GitHub
Skip to content

Set MSBUILDDEBUGPATH in common build scripts for crash diagnostics - #16715

Merged
danmoseley merged 1 commit into
dotnet:mainfrom
danmoseley:arcade-msbuilddebugpath
Apr 14, 2026
Merged

Set MSBUILDDEBUGPATH in common build scripts for crash diagnostics#16715
danmoseley merged 1 commit into
dotnet:mainfrom
danmoseley:arcade-msbuilddebugpath

Conversation

@danmoseley

@danmoseleydanmoseley commented Apr 14, 2026

Copy link
Copy Markdown

When MSBuild encounters a fatal internal error (MSB4166), it writes a failure.txt crash dump file. By default these go to the system temp directory, which CI pipelines typically don't collect as artifacts — making it hard to diagnose intermittent MSBuild crashes in CI.

This change sets MSBUILDDEBUGPATH in arcade's common build scripts (tools.sh and tools.ps1) to direct these crash diagnostics to artifacts/log/<configuration>/MsbuildDebugLogs/, which is already collected by CI pipelines.

Key design choices:

  • Guarded: only sets MSBUILDDEBUGPATH if it isn't already defined, so repo-specific or user overrides are respected
  • No explicit mkdir: MSBuild's FrameworkDebugUtils.SetDebugPath() creates the directory itself inside a try/catch when needed, avoiding set -e risk in bash and keeping the change minimal
  • No disk bloat: without MSBUILDDEBUGENGINE=1, only crash dump files are written here (not verbose debug/scheduler logs), so the directory will be empty on healthy builds
  • Unconditional (not CI-only): crash diagnostics are useful for local debugging too, and since only crash files land here, there's no performance or disk concern

Several repos (e.g., dotnet/runtime) already set MSBUILDDEBUGPATH in their own build scripts for specific subcomponents. This change provides the default for all arcade-based repos, filling the gap for top-level builds.

Relates to getting data to fixdotnet/runtime#92290 and any other MSBuild crashes in any arcade repos
Supersedes dotnet/runtime#126806

Set MSBUILDDEBUGPATH in eng/common/tools.sh and eng/common/tools.ps1 so that
MSBuild crash diagnostics (MSB4166 failure.txt files) are written to a known
location under artifacts/log/<config>/MsbuildDebugLogs/ instead of the system
temp directory. This ensures they are captured as build artifacts in CI.
Previously individual repos had to set this in their own build scripts (e.g.
dotnet/runtime's src/coreclr/build-runtime.sh, src/tests/build.sh). Putting
it in the common tooling covers all repos using arcade infrastructure.
Relates to dotnet/runtime#92290
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR improves MSBuild crash diagnostics collection by defaulting MSBUILDDEBUGPATH in Arcade’s shared build tooling to a location under artifacts/log/<configuration>/, which CI already publishes as an artifact—making MSB4166 “failure.txt” outputs available for postmortem analysis.

Changes:

  • Set MSBUILDDEBUGPATH (only if not already defined) in eng/common/tools.sh.
  • Set MSBUILDDEBUGPATH (only if not already defined) in eng/common/tools.ps1.
  • Route MSBuild crash diagnostics to artifacts/log/<configuration>/MsbuildDebugLogs/.
Show a summary per file
FileDescription
eng/common/tools.shExports MSBUILDDEBUGPATH to a stable artifacts log subdirectory when unset.
eng/common/tools.ps1Sets $env:MSBUILDDEBUGPATH to a stable artifacts log subdirectory when unset.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 0

@danmoseley
danmoseley requested a review from hoyosjsApril 14, 2026 15:03
Comment threadeng/common/tools.ps1
# Direct MSBuild crash diagnostics (MSB4166 failure.txt files) to a known location
# under artifacts/log so they are captured as build artifacts in CI.
if (-not $env:MSBUILDDEBUGPATH) {
$env:MSBUILDDEBUGPATH = Join-Path $LogDir 'MsbuildDebugLogs'

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This also collects them on dev machines - I am not against that anyway.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes and I think that's a good thing.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

MSBuild crashing in the build

3 participants

@danmoseley@hoyosjs