Fix failing test on NativeAOT - #109853

Merged
noahfalk merged 1 commit into
dotnet:mainfrom
noahfalk:fix_alloc_test
Nov 19, 2024
Merged

Fix failing test on NativeAOT#109853
noahfalk merged 1 commit into
dotnet:mainfrom
noahfalk:fix_alloc_test

Conversation

@noahfalk

Copy link
Copy Markdown
Member

Fixes#109828
This test hadn't been updated to account for NativeAOT's lack of type names in the new randomized sampling allocation events.

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

Fixesdotnet#109828
This test hadn't been updated to account for NativeAOT's lack of type names in the new randomized sampling allocation events.
@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@noahfalk

Copy link
Copy Markdown
MemberAuthor

@jkotas@MichalStrehovsky - I think this resolves the failure in the allocation sampling test though it appears the outer loop runs still have some other failures in the Numerics tests.

@MichalStrehovsky

Copy link
Copy Markdown
Member

@jkotas@MichalStrehovsky - I think this resolves the failure in the allocation sampling test though it appears the outer loop runs still have some other failures in the Numerics tests.

That one was fixed in #109842. We could rebase and recheck, but I think this is good to merge as-is! Thanks!

Btw, we are able to compute type names of everything on the GC heap (since we keep it around for object.GetType to work). If it's possible to call into managed code at the spot where this is needed (we can only compute the names in managed code), it should be fixable.

@tommcdontommcdon left a comment

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.

Thanks!

@noahfalk

Copy link
Copy Markdown
MemberAuthor

Btw, we are able to compute type names of everything on the GC heap (since we keep it around for object.GetType to work). If it's possible to call into managed code at the spot where this is needed (we can only compute the names in managed code), it should be fixable.

Ah thats good to know. I had been under the impression the names were strippable like other metadata and couldn't be assured. The place where we need the name is here: https://github.com/dotnet/runtime/blob/main/src/coreclr/nativeaot/Runtime/GCHelpers.cpp#L485

The callstack would look like:

FireAllocationSampled
GcAllocInternal
RhAllocateXYZ
ManagedCode

I assume there isn't anything preventing a native->managed call at that point but it would be a little odd if managed code did any allocations which could lead to recursion. Not knowing what is involved just yet, do you think we could keep that call allocation-free?

@noahfalk
noahfalk merged commit e33be4d into dotnet:mainNov 19, 2024
@jkotas

Copy link
Copy Markdown
Member

I assume there isn't anything preventing a native->managed call at that point but it would be a little odd if managed code did any allocations which could lead to recursion.

Right, it would not be pretty to make this work.

Sending the type name as part of each sample can result in a lot of redundant information being transferred. Would it be better to send the type id to type name mapping in separate events, once for each type id? It would work better for native AOT as well.

@noahfalk

Copy link
Copy Markdown
MemberAuthor

Sending the type name as part of each sample can result in a lot of redundant information being transferred. Would it be better to send the type id to type name mapping in separate events, once for each type id? It would work better for native AOT as well.

It is possible to create separate events that do id->name mapping, but that bring some alternate complexity to track which mappings need to be sent and dealing with potential dropped events carrying the mapping data. Historically all the AllocationTick events carried the name information inline and I'm not aware of any complaints about data size. The plan for NativeAOT is that TypeId can be looked up in a PDB. Assuming the profiler cares about stack traces where the allocations are occurring it will need to do PDB lookups for code IPs already. If we get some feedback from profiler vendors that ID->name mapping events would be helpful nothing precludes us from adding it (as well as offering a name-free variant of the AllocationSampled event) but I'm going to hold off on increasing the feature scope for now.

@MichalStrehovsky

Copy link
Copy Markdown
Member

The plan for NativeAOT is that TypeId can be looked up in a PDB. Assuming the profiler cares about stack traces where the allocations are occurring it will need to do PDB lookups for code IPs already.

The stack traces are a similar story - we do have that information (unless the user specified StackTraceSupport=false property), but it's only computable in managed code.

The information that we have in metadata both for types and method bodies is more structured than in the PDB - the PDB only has mangled names that are not particularly reversible. It works, but it won't produce nice identifier names. But it's better than nothing, and good enough 98% of time.

I guess none of this is something that we would need to address now, just something to keep in mind should we have a need for this.

mikelle-rogers pushed a commit to mikelle-rogers/runtime that referenced this pull request Dec 10, 2024
Fixesdotnet#109828
This test hadn't been updated to account for NativeAOT's lack of type names in the new randomized sampling allocation events.
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Dec 20, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

randomizedallocationsampling tests are failing on nativeaot

4 participants

@noahfalk@MichalStrehovsky@jkotas@tommcdon
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Fix failing test on NativeAOT - #109853

Merged
noahfalk merged 1 commit into
dotnet:mainfrom
noahfalk:fix_alloc_test
Nov 19, 2024
Merged

Fix failing test on NativeAOT#109853
noahfalk merged 1 commit into
dotnet:mainfrom
noahfalk:fix_alloc_test

Conversation

@noahfalk

Copy link
Copy Markdown
Member

Fixes#109828
This test hadn't been updated to account for NativeAOT's lack of type names in the new randomized sampling allocation events.

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

Fixesdotnet#109828
This test hadn't been updated to account for NativeAOT's lack of type names in the new randomized sampling allocation events.
@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@noahfalk

Copy link
Copy Markdown
MemberAuthor

@jkotas@MichalStrehovsky - I think this resolves the failure in the allocation sampling test though it appears the outer loop runs still have some other failures in the Numerics tests.

@MichalStrehovsky

Copy link
Copy Markdown
Member

@jkotas@MichalStrehovsky - I think this resolves the failure in the allocation sampling test though it appears the outer loop runs still have some other failures in the Numerics tests.

That one was fixed in #109842. We could rebase and recheck, but I think this is good to merge as-is! Thanks!

Btw, we are able to compute type names of everything on the GC heap (since we keep it around for object.GetType to work). If it's possible to call into managed code at the spot where this is needed (we can only compute the names in managed code), it should be fixable.

@tommcdontommcdon left a comment

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.

Thanks!

@noahfalk

Copy link
Copy Markdown
MemberAuthor

Btw, we are able to compute type names of everything on the GC heap (since we keep it around for object.GetType to work). If it's possible to call into managed code at the spot where this is needed (we can only compute the names in managed code), it should be fixable.

Ah thats good to know. I had been under the impression the names were strippable like other metadata and couldn't be assured. The place where we need the name is here: https://github.com/dotnet/runtime/blob/main/src/coreclr/nativeaot/Runtime/GCHelpers.cpp#L485

The callstack would look like:

FireAllocationSampled
GcAllocInternal
RhAllocateXYZ
ManagedCode

I assume there isn't anything preventing a native->managed call at that point but it would be a little odd if managed code did any allocations which could lead to recursion. Not knowing what is involved just yet, do you think we could keep that call allocation-free?

@noahfalk
noahfalk merged commit e33be4d into dotnet:mainNov 19, 2024
@jkotas

Copy link
Copy Markdown
Member

I assume there isn't anything preventing a native->managed call at that point but it would be a little odd if managed code did any allocations which could lead to recursion.

Right, it would not be pretty to make this work.

Sending the type name as part of each sample can result in a lot of redundant information being transferred. Would it be better to send the type id to type name mapping in separate events, once for each type id? It would work better for native AOT as well.

@noahfalk

Copy link
Copy Markdown
MemberAuthor

Sending the type name as part of each sample can result in a lot of redundant information being transferred. Would it be better to send the type id to type name mapping in separate events, once for each type id? It would work better for native AOT as well.

It is possible to create separate events that do id->name mapping, but that bring some alternate complexity to track which mappings need to be sent and dealing with potential dropped events carrying the mapping data. Historically all the AllocationTick events carried the name information inline and I'm not aware of any complaints about data size. The plan for NativeAOT is that TypeId can be looked up in a PDB. Assuming the profiler cares about stack traces where the allocations are occurring it will need to do PDB lookups for code IPs already. If we get some feedback from profiler vendors that ID->name mapping events would be helpful nothing precludes us from adding it (as well as offering a name-free variant of the AllocationSampled event) but I'm going to hold off on increasing the feature scope for now.

@MichalStrehovsky

Copy link
Copy Markdown
Member

The plan for NativeAOT is that TypeId can be looked up in a PDB. Assuming the profiler cares about stack traces where the allocations are occurring it will need to do PDB lookups for code IPs already.

The stack traces are a similar story - we do have that information (unless the user specified StackTraceSupport=false property), but it's only computable in managed code.

The information that we have in metadata both for types and method bodies is more structured than in the PDB - the PDB only has mangled names that are not particularly reversible. It works, but it won't produce nice identifier names. But it's better than nothing, and good enough 98% of time.

I guess none of this is something that we would need to address now, just something to keep in mind should we have a need for this.

mikelle-rogers pushed a commit to mikelle-rogers/runtime that referenced this pull request Dec 10, 2024
Fixesdotnet#109828
This test hadn't been updated to account for NativeAOT's lack of type names in the new randomized sampling allocation events.
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Dec 20, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

randomizedallocationsampling tests are failing on nativeaot

4 participants

@noahfalk@MichalStrehovsky@jkotas@tommcdon
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix failing test on NativeAOT - #109853

Merged
noahfalk merged 1 commit into
dotnet:mainfrom
noahfalk:fix_alloc_test
Nov 19, 2024
Merged

Fix failing test on NativeAOT#109853
noahfalk merged 1 commit into
dotnet:mainfrom
noahfalk:fix_alloc_test

Conversation

@noahfalk

Copy link
Copy Markdown
Member

Fixes#109828
This test hadn't been updated to account for NativeAOT's lack of type names in the new randomized sampling allocation events.

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

Fixesdotnet#109828
This test hadn't been updated to account for NativeAOT's lack of type names in the new randomized sampling allocation events.
@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@noahfalk

Copy link
Copy Markdown
MemberAuthor

@jkotas@MichalStrehovsky - I think this resolves the failure in the allocation sampling test though it appears the outer loop runs still have some other failures in the Numerics tests.

@MichalStrehovsky

Copy link
Copy Markdown
Member

@jkotas@MichalStrehovsky - I think this resolves the failure in the allocation sampling test though it appears the outer loop runs still have some other failures in the Numerics tests.

That one was fixed in #109842. We could rebase and recheck, but I think this is good to merge as-is! Thanks!

Btw, we are able to compute type names of everything on the GC heap (since we keep it around for object.GetType to work). If it's possible to call into managed code at the spot where this is needed (we can only compute the names in managed code), it should be fixable.

@tommcdontommcdon left a comment

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.

Thanks!

@noahfalk

Copy link
Copy Markdown
MemberAuthor

Btw, we are able to compute type names of everything on the GC heap (since we keep it around for object.GetType to work). If it's possible to call into managed code at the spot where this is needed (we can only compute the names in managed code), it should be fixable.

Ah thats good to know. I had been under the impression the names were strippable like other metadata and couldn't be assured. The place where we need the name is here: https://github.com/dotnet/runtime/blob/main/src/coreclr/nativeaot/Runtime/GCHelpers.cpp#L485

The callstack would look like:

FireAllocationSampled
GcAllocInternal
RhAllocateXYZ
ManagedCode

I assume there isn't anything preventing a native->managed call at that point but it would be a little odd if managed code did any allocations which could lead to recursion. Not knowing what is involved just yet, do you think we could keep that call allocation-free?

@noahfalk
noahfalk merged commit e33be4d into dotnet:mainNov 19, 2024
@jkotas

Copy link
Copy Markdown
Member

I assume there isn't anything preventing a native->managed call at that point but it would be a little odd if managed code did any allocations which could lead to recursion.

Right, it would not be pretty to make this work.

Sending the type name as part of each sample can result in a lot of redundant information being transferred. Would it be better to send the type id to type name mapping in separate events, once for each type id? It would work better for native AOT as well.

@noahfalk

Copy link
Copy Markdown
MemberAuthor

Sending the type name as part of each sample can result in a lot of redundant information being transferred. Would it be better to send the type id to type name mapping in separate events, once for each type id? It would work better for native AOT as well.

It is possible to create separate events that do id->name mapping, but that bring some alternate complexity to track which mappings need to be sent and dealing with potential dropped events carrying the mapping data. Historically all the AllocationTick events carried the name information inline and I'm not aware of any complaints about data size. The plan for NativeAOT is that TypeId can be looked up in a PDB. Assuming the profiler cares about stack traces where the allocations are occurring it will need to do PDB lookups for code IPs already. If we get some feedback from profiler vendors that ID->name mapping events would be helpful nothing precludes us from adding it (as well as offering a name-free variant of the AllocationSampled event) but I'm going to hold off on increasing the feature scope for now.

@MichalStrehovsky

Copy link
Copy Markdown
Member

The plan for NativeAOT is that TypeId can be looked up in a PDB. Assuming the profiler cares about stack traces where the allocations are occurring it will need to do PDB lookups for code IPs already.

The stack traces are a similar story - we do have that information (unless the user specified StackTraceSupport=false property), but it's only computable in managed code.

The information that we have in metadata both for types and method bodies is more structured than in the PDB - the PDB only has mangled names that are not particularly reversible. It works, but it won't produce nice identifier names. But it's better than nothing, and good enough 98% of time.

I guess none of this is something that we would need to address now, just something to keep in mind should we have a need for this.

mikelle-rogers pushed a commit to mikelle-rogers/runtime that referenced this pull request Dec 10, 2024
Fixesdotnet#109828
This test hadn't been updated to account for NativeAOT's lack of type names in the new randomized sampling allocation events.
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Dec 20, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

randomizedallocationsampling tests are failing on nativeaot

4 participants

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

Fix failing test on NativeAOT - #109853

Merged
noahfalk merged 1 commit into
dotnet:mainfrom
noahfalk:fix_alloc_test
Nov 19, 2024
Merged

Fix failing test on NativeAOT#109853
noahfalk merged 1 commit into
dotnet:mainfrom
noahfalk:fix_alloc_test

Conversation

@noahfalk

Copy link
Copy Markdown
Member

Fixes#109828
This test hadn't been updated to account for NativeAOT's lack of type names in the new randomized sampling allocation events.

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

Fixesdotnet#109828
This test hadn't been updated to account for NativeAOT's lack of type names in the new randomized sampling allocation events.
@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@noahfalk

Copy link
Copy Markdown
MemberAuthor

@jkotas@MichalStrehovsky - I think this resolves the failure in the allocation sampling test though it appears the outer loop runs still have some other failures in the Numerics tests.

@MichalStrehovsky

Copy link
Copy Markdown
Member

@jkotas@MichalStrehovsky - I think this resolves the failure in the allocation sampling test though it appears the outer loop runs still have some other failures in the Numerics tests.

That one was fixed in #109842. We could rebase and recheck, but I think this is good to merge as-is! Thanks!

Btw, we are able to compute type names of everything on the GC heap (since we keep it around for object.GetType to work). If it's possible to call into managed code at the spot where this is needed (we can only compute the names in managed code), it should be fixable.

@tommcdontommcdon left a comment

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.

Thanks!

@noahfalk

Copy link
Copy Markdown
MemberAuthor

Btw, we are able to compute type names of everything on the GC heap (since we keep it around for object.GetType to work). If it's possible to call into managed code at the spot where this is needed (we can only compute the names in managed code), it should be fixable.

Ah thats good to know. I had been under the impression the names were strippable like other metadata and couldn't be assured. The place where we need the name is here: https://github.com/dotnet/runtime/blob/main/src/coreclr/nativeaot/Runtime/GCHelpers.cpp#L485

The callstack would look like:

FireAllocationSampled
GcAllocInternal
RhAllocateXYZ
ManagedCode

I assume there isn't anything preventing a native->managed call at that point but it would be a little odd if managed code did any allocations which could lead to recursion. Not knowing what is involved just yet, do you think we could keep that call allocation-free?

@noahfalk
noahfalk merged commit e33be4d into dotnet:mainNov 19, 2024
@jkotas

Copy link
Copy Markdown
Member

I assume there isn't anything preventing a native->managed call at that point but it would be a little odd if managed code did any allocations which could lead to recursion.

Right, it would not be pretty to make this work.

Sending the type name as part of each sample can result in a lot of redundant information being transferred. Would it be better to send the type id to type name mapping in separate events, once for each type id? It would work better for native AOT as well.

@noahfalk

Copy link
Copy Markdown
MemberAuthor

Sending the type name as part of each sample can result in a lot of redundant information being transferred. Would it be better to send the type id to type name mapping in separate events, once for each type id? It would work better for native AOT as well.

It is possible to create separate events that do id->name mapping, but that bring some alternate complexity to track which mappings need to be sent and dealing with potential dropped events carrying the mapping data. Historically all the AllocationTick events carried the name information inline and I'm not aware of any complaints about data size. The plan for NativeAOT is that TypeId can be looked up in a PDB. Assuming the profiler cares about stack traces where the allocations are occurring it will need to do PDB lookups for code IPs already. If we get some feedback from profiler vendors that ID->name mapping events would be helpful nothing precludes us from adding it (as well as offering a name-free variant of the AllocationSampled event) but I'm going to hold off on increasing the feature scope for now.

@MichalStrehovsky

Copy link
Copy Markdown
Member

The plan for NativeAOT is that TypeId can be looked up in a PDB. Assuming the profiler cares about stack traces where the allocations are occurring it will need to do PDB lookups for code IPs already.

The stack traces are a similar story - we do have that information (unless the user specified StackTraceSupport=false property), but it's only computable in managed code.

The information that we have in metadata both for types and method bodies is more structured than in the PDB - the PDB only has mangled names that are not particularly reversible. It works, but it won't produce nice identifier names. But it's better than nothing, and good enough 98% of time.

I guess none of this is something that we would need to address now, just something to keep in mind should we have a need for this.

mikelle-rogers pushed a commit to mikelle-rogers/runtime that referenced this pull request Dec 10, 2024
Fixesdotnet#109828
This test hadn't been updated to account for NativeAOT's lack of type names in the new randomized sampling allocation events.
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Dec 20, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

randomizedallocationsampling tests are failing on nativeaot

4 participants

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

Fix failing test on NativeAOT - #109853

Merged
noahfalk merged 1 commit into
dotnet:mainfrom
noahfalk:fix_alloc_test
Nov 19, 2024
Merged

Fix failing test on NativeAOT#109853
noahfalk merged 1 commit into
dotnet:mainfrom
noahfalk:fix_alloc_test

Conversation

@noahfalk

Copy link
Copy Markdown
Member

Fixes#109828
This test hadn't been updated to account for NativeAOT's lack of type names in the new randomized sampling allocation events.

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

Fixesdotnet#109828
This test hadn't been updated to account for NativeAOT's lack of type names in the new randomized sampling allocation events.
@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@noahfalk

Copy link
Copy Markdown
MemberAuthor

@jkotas@MichalStrehovsky - I think this resolves the failure in the allocation sampling test though it appears the outer loop runs still have some other failures in the Numerics tests.

@MichalStrehovsky

Copy link
Copy Markdown
Member

@jkotas@MichalStrehovsky - I think this resolves the failure in the allocation sampling test though it appears the outer loop runs still have some other failures in the Numerics tests.

That one was fixed in #109842. We could rebase and recheck, but I think this is good to merge as-is! Thanks!

Btw, we are able to compute type names of everything on the GC heap (since we keep it around for object.GetType to work). If it's possible to call into managed code at the spot where this is needed (we can only compute the names in managed code), it should be fixable.

@tommcdontommcdon left a comment

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.

Thanks!

@noahfalk

Copy link
Copy Markdown
MemberAuthor

Btw, we are able to compute type names of everything on the GC heap (since we keep it around for object.GetType to work). If it's possible to call into managed code at the spot where this is needed (we can only compute the names in managed code), it should be fixable.

Ah thats good to know. I had been under the impression the names were strippable like other metadata and couldn't be assured. The place where we need the name is here: https://github.com/dotnet/runtime/blob/main/src/coreclr/nativeaot/Runtime/GCHelpers.cpp#L485

The callstack would look like:

FireAllocationSampled
GcAllocInternal
RhAllocateXYZ
ManagedCode

I assume there isn't anything preventing a native->managed call at that point but it would be a little odd if managed code did any allocations which could lead to recursion. Not knowing what is involved just yet, do you think we could keep that call allocation-free?

@noahfalk
noahfalk merged commit e33be4d into dotnet:mainNov 19, 2024
@jkotas

Copy link
Copy Markdown
Member

I assume there isn't anything preventing a native->managed call at that point but it would be a little odd if managed code did any allocations which could lead to recursion.

Right, it would not be pretty to make this work.

Sending the type name as part of each sample can result in a lot of redundant information being transferred. Would it be better to send the type id to type name mapping in separate events, once for each type id? It would work better for native AOT as well.

@noahfalk

Copy link
Copy Markdown
MemberAuthor

Sending the type name as part of each sample can result in a lot of redundant information being transferred. Would it be better to send the type id to type name mapping in separate events, once for each type id? It would work better for native AOT as well.

It is possible to create separate events that do id->name mapping, but that bring some alternate complexity to track which mappings need to be sent and dealing with potential dropped events carrying the mapping data. Historically all the AllocationTick events carried the name information inline and I'm not aware of any complaints about data size. The plan for NativeAOT is that TypeId can be looked up in a PDB. Assuming the profiler cares about stack traces where the allocations are occurring it will need to do PDB lookups for code IPs already. If we get some feedback from profiler vendors that ID->name mapping events would be helpful nothing precludes us from adding it (as well as offering a name-free variant of the AllocationSampled event) but I'm going to hold off on increasing the feature scope for now.

@MichalStrehovsky

Copy link
Copy Markdown
Member

The plan for NativeAOT is that TypeId can be looked up in a PDB. Assuming the profiler cares about stack traces where the allocations are occurring it will need to do PDB lookups for code IPs already.

The stack traces are a similar story - we do have that information (unless the user specified StackTraceSupport=false property), but it's only computable in managed code.

The information that we have in metadata both for types and method bodies is more structured than in the PDB - the PDB only has mangled names that are not particularly reversible. It works, but it won't produce nice identifier names. But it's better than nothing, and good enough 98% of time.

I guess none of this is something that we would need to address now, just something to keep in mind should we have a need for this.

mikelle-rogers pushed a commit to mikelle-rogers/runtime that referenced this pull request Dec 10, 2024
Fixesdotnet#109828
This test hadn't been updated to account for NativeAOT's lack of type names in the new randomized sampling allocation events.
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Dec 20, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

randomizedallocationsampling tests are failing on nativeaot

4 participants

@noahfalk@MichalStrehovsky@jkotas@tommcdon
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix failing test on NativeAOT - #109853

Merged
noahfalk merged 1 commit into
dotnet:mainfrom
noahfalk:fix_alloc_test
Nov 19, 2024
Merged

Fix failing test on NativeAOT#109853
noahfalk merged 1 commit into
dotnet:mainfrom
noahfalk:fix_alloc_test

Conversation

@noahfalk

Copy link
Copy Markdown
Member

Fixes#109828
This test hadn't been updated to account for NativeAOT's lack of type names in the new randomized sampling allocation events.

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

Fixesdotnet#109828
This test hadn't been updated to account for NativeAOT's lack of type names in the new randomized sampling allocation events.
@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@noahfalk

Copy link
Copy Markdown
MemberAuthor

@jkotas@MichalStrehovsky - I think this resolves the failure in the allocation sampling test though it appears the outer loop runs still have some other failures in the Numerics tests.

@MichalStrehovsky

Copy link
Copy Markdown
Member

@jkotas@MichalStrehovsky - I think this resolves the failure in the allocation sampling test though it appears the outer loop runs still have some other failures in the Numerics tests.

That one was fixed in #109842. We could rebase and recheck, but I think this is good to merge as-is! Thanks!

Btw, we are able to compute type names of everything on the GC heap (since we keep it around for object.GetType to work). If it's possible to call into managed code at the spot where this is needed (we can only compute the names in managed code), it should be fixable.

@tommcdontommcdon left a comment

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.

Thanks!

@noahfalk

Copy link
Copy Markdown
MemberAuthor

Btw, we are able to compute type names of everything on the GC heap (since we keep it around for object.GetType to work). If it's possible to call into managed code at the spot where this is needed (we can only compute the names in managed code), it should be fixable.

Ah thats good to know. I had been under the impression the names were strippable like other metadata and couldn't be assured. The place where we need the name is here: https://github.com/dotnet/runtime/blob/main/src/coreclr/nativeaot/Runtime/GCHelpers.cpp#L485

The callstack would look like:

FireAllocationSampled
GcAllocInternal
RhAllocateXYZ
ManagedCode

I assume there isn't anything preventing a native->managed call at that point but it would be a little odd if managed code did any allocations which could lead to recursion. Not knowing what is involved just yet, do you think we could keep that call allocation-free?

@noahfalk
noahfalk merged commit e33be4d into dotnet:mainNov 19, 2024
@jkotas

Copy link
Copy Markdown
Member

I assume there isn't anything preventing a native->managed call at that point but it would be a little odd if managed code did any allocations which could lead to recursion.

Right, it would not be pretty to make this work.

Sending the type name as part of each sample can result in a lot of redundant information being transferred. Would it be better to send the type id to type name mapping in separate events, once for each type id? It would work better for native AOT as well.

@noahfalk

Copy link
Copy Markdown
MemberAuthor

Sending the type name as part of each sample can result in a lot of redundant information being transferred. Would it be better to send the type id to type name mapping in separate events, once for each type id? It would work better for native AOT as well.

It is possible to create separate events that do id->name mapping, but that bring some alternate complexity to track which mappings need to be sent and dealing with potential dropped events carrying the mapping data. Historically all the AllocationTick events carried the name information inline and I'm not aware of any complaints about data size. The plan for NativeAOT is that TypeId can be looked up in a PDB. Assuming the profiler cares about stack traces where the allocations are occurring it will need to do PDB lookups for code IPs already. If we get some feedback from profiler vendors that ID->name mapping events would be helpful nothing precludes us from adding it (as well as offering a name-free variant of the AllocationSampled event) but I'm going to hold off on increasing the feature scope for now.

@MichalStrehovsky

Copy link
Copy Markdown
Member

The plan for NativeAOT is that TypeId can be looked up in a PDB. Assuming the profiler cares about stack traces where the allocations are occurring it will need to do PDB lookups for code IPs already.

The stack traces are a similar story - we do have that information (unless the user specified StackTraceSupport=false property), but it's only computable in managed code.

The information that we have in metadata both for types and method bodies is more structured than in the PDB - the PDB only has mangled names that are not particularly reversible. It works, but it won't produce nice identifier names. But it's better than nothing, and good enough 98% of time.

I guess none of this is something that we would need to address now, just something to keep in mind should we have a need for this.

mikelle-rogers pushed a commit to mikelle-rogers/runtime that referenced this pull request Dec 10, 2024
Fixesdotnet#109828
This test hadn't been updated to account for NativeAOT's lack of type names in the new randomized sampling allocation events.
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Dec 20, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

randomizedallocationsampling tests are failing on nativeaot

4 participants

@noahfalk@MichalStrehovsky@jkotas@tommcdon
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix failing test on NativeAOT - #109853

Merged
noahfalk merged 1 commit into
dotnet:mainfrom
noahfalk:fix_alloc_test
Nov 19, 2024
Merged

Fix failing test on NativeAOT#109853
noahfalk merged 1 commit into
dotnet:mainfrom
noahfalk:fix_alloc_test

Conversation

@noahfalk

Copy link
Copy Markdown
Member

Fixes#109828
This test hadn't been updated to account for NativeAOT's lack of type names in the new randomized sampling allocation events.

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

Fixesdotnet#109828
This test hadn't been updated to account for NativeAOT's lack of type names in the new randomized sampling allocation events.
@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@noahfalk

Copy link
Copy Markdown
MemberAuthor

@jkotas@MichalStrehovsky - I think this resolves the failure in the allocation sampling test though it appears the outer loop runs still have some other failures in the Numerics tests.

@MichalStrehovsky

Copy link
Copy Markdown
Member

@jkotas@MichalStrehovsky - I think this resolves the failure in the allocation sampling test though it appears the outer loop runs still have some other failures in the Numerics tests.

That one was fixed in #109842. We could rebase and recheck, but I think this is good to merge as-is! Thanks!

Btw, we are able to compute type names of everything on the GC heap (since we keep it around for object.GetType to work). If it's possible to call into managed code at the spot where this is needed (we can only compute the names in managed code), it should be fixable.

@tommcdontommcdon left a comment

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.

Thanks!

@noahfalk

Copy link
Copy Markdown
MemberAuthor

Btw, we are able to compute type names of everything on the GC heap (since we keep it around for object.GetType to work). If it's possible to call into managed code at the spot where this is needed (we can only compute the names in managed code), it should be fixable.

Ah thats good to know. I had been under the impression the names were strippable like other metadata and couldn't be assured. The place where we need the name is here: https://github.com/dotnet/runtime/blob/main/src/coreclr/nativeaot/Runtime/GCHelpers.cpp#L485

The callstack would look like:

FireAllocationSampled
GcAllocInternal
RhAllocateXYZ
ManagedCode

I assume there isn't anything preventing a native->managed call at that point but it would be a little odd if managed code did any allocations which could lead to recursion. Not knowing what is involved just yet, do you think we could keep that call allocation-free?

@noahfalk
noahfalk merged commit e33be4d into dotnet:mainNov 19, 2024
@jkotas

Copy link
Copy Markdown
Member

I assume there isn't anything preventing a native->managed call at that point but it would be a little odd if managed code did any allocations which could lead to recursion.

Right, it would not be pretty to make this work.

Sending the type name as part of each sample can result in a lot of redundant information being transferred. Would it be better to send the type id to type name mapping in separate events, once for each type id? It would work better for native AOT as well.

@noahfalk

Copy link
Copy Markdown
MemberAuthor

Sending the type name as part of each sample can result in a lot of redundant information being transferred. Would it be better to send the type id to type name mapping in separate events, once for each type id? It would work better for native AOT as well.

It is possible to create separate events that do id->name mapping, but that bring some alternate complexity to track which mappings need to be sent and dealing with potential dropped events carrying the mapping data. Historically all the AllocationTick events carried the name information inline and I'm not aware of any complaints about data size. The plan for NativeAOT is that TypeId can be looked up in a PDB. Assuming the profiler cares about stack traces where the allocations are occurring it will need to do PDB lookups for code IPs already. If we get some feedback from profiler vendors that ID->name mapping events would be helpful nothing precludes us from adding it (as well as offering a name-free variant of the AllocationSampled event) but I'm going to hold off on increasing the feature scope for now.

@MichalStrehovsky

Copy link
Copy Markdown
Member

The plan for NativeAOT is that TypeId can be looked up in a PDB. Assuming the profiler cares about stack traces where the allocations are occurring it will need to do PDB lookups for code IPs already.

The stack traces are a similar story - we do have that information (unless the user specified StackTraceSupport=false property), but it's only computable in managed code.

The information that we have in metadata both for types and method bodies is more structured than in the PDB - the PDB only has mangled names that are not particularly reversible. It works, but it won't produce nice identifier names. But it's better than nothing, and good enough 98% of time.

I guess none of this is something that we would need to address now, just something to keep in mind should we have a need for this.

mikelle-rogers pushed a commit to mikelle-rogers/runtime that referenced this pull request Dec 10, 2024
Fixesdotnet#109828
This test hadn't been updated to account for NativeAOT's lack of type names in the new randomized sampling allocation events.
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Dec 20, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

randomizedallocationsampling tests are failing on nativeaot

4 participants

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

Fix failing test on NativeAOT - #109853

Merged
noahfalk merged 1 commit into
dotnet:mainfrom
noahfalk:fix_alloc_test
Nov 19, 2024
Merged

Fix failing test on NativeAOT#109853
noahfalk merged 1 commit into
dotnet:mainfrom
noahfalk:fix_alloc_test

Conversation

@noahfalk

Copy link
Copy Markdown
Member

Fixes#109828
This test hadn't been updated to account for NativeAOT's lack of type names in the new randomized sampling allocation events.

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

Fixesdotnet#109828
This test hadn't been updated to account for NativeAOT's lack of type names in the new randomized sampling allocation events.
@noahfalk

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@noahfalk

Copy link
Copy Markdown
MemberAuthor

@jkotas@MichalStrehovsky - I think this resolves the failure in the allocation sampling test though it appears the outer loop runs still have some other failures in the Numerics tests.

@MichalStrehovsky

Copy link
Copy Markdown
Member

@jkotas@MichalStrehovsky - I think this resolves the failure in the allocation sampling test though it appears the outer loop runs still have some other failures in the Numerics tests.

That one was fixed in #109842. We could rebase and recheck, but I think this is good to merge as-is! Thanks!

Btw, we are able to compute type names of everything on the GC heap (since we keep it around for object.GetType to work). If it's possible to call into managed code at the spot where this is needed (we can only compute the names in managed code), it should be fixable.

@tommcdontommcdon left a comment

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.

Thanks!

@noahfalk

Copy link
Copy Markdown
MemberAuthor

Btw, we are able to compute type names of everything on the GC heap (since we keep it around for object.GetType to work). If it's possible to call into managed code at the spot where this is needed (we can only compute the names in managed code), it should be fixable.

Ah thats good to know. I had been under the impression the names were strippable like other metadata and couldn't be assured. The place where we need the name is here: https://github.com/dotnet/runtime/blob/main/src/coreclr/nativeaot/Runtime/GCHelpers.cpp#L485

The callstack would look like:

FireAllocationSampled
GcAllocInternal
RhAllocateXYZ
ManagedCode

I assume there isn't anything preventing a native->managed call at that point but it would be a little odd if managed code did any allocations which could lead to recursion. Not knowing what is involved just yet, do you think we could keep that call allocation-free?

@noahfalk
noahfalk merged commit e33be4d into dotnet:mainNov 19, 2024
@jkotas

Copy link
Copy Markdown
Member

I assume there isn't anything preventing a native->managed call at that point but it would be a little odd if managed code did any allocations which could lead to recursion.

Right, it would not be pretty to make this work.

Sending the type name as part of each sample can result in a lot of redundant information being transferred. Would it be better to send the type id to type name mapping in separate events, once for each type id? It would work better for native AOT as well.

@noahfalk

Copy link
Copy Markdown
MemberAuthor

Sending the type name as part of each sample can result in a lot of redundant information being transferred. Would it be better to send the type id to type name mapping in separate events, once for each type id? It would work better for native AOT as well.

It is possible to create separate events that do id->name mapping, but that bring some alternate complexity to track which mappings need to be sent and dealing with potential dropped events carrying the mapping data. Historically all the AllocationTick events carried the name information inline and I'm not aware of any complaints about data size. The plan for NativeAOT is that TypeId can be looked up in a PDB. Assuming the profiler cares about stack traces where the allocations are occurring it will need to do PDB lookups for code IPs already. If we get some feedback from profiler vendors that ID->name mapping events would be helpful nothing precludes us from adding it (as well as offering a name-free variant of the AllocationSampled event) but I'm going to hold off on increasing the feature scope for now.

@MichalStrehovsky

Copy link
Copy Markdown
Member

The plan for NativeAOT is that TypeId can be looked up in a PDB. Assuming the profiler cares about stack traces where the allocations are occurring it will need to do PDB lookups for code IPs already.

The stack traces are a similar story - we do have that information (unless the user specified StackTraceSupport=false property), but it's only computable in managed code.

The information that we have in metadata both for types and method bodies is more structured than in the PDB - the PDB only has mangled names that are not particularly reversible. It works, but it won't produce nice identifier names. But it's better than nothing, and good enough 98% of time.

I guess none of this is something that we would need to address now, just something to keep in mind should we have a need for this.

mikelle-rogers pushed a commit to mikelle-rogers/runtime that referenced this pull request Dec 10, 2024
Fixesdotnet#109828
This test hadn't been updated to account for NativeAOT's lack of type names in the new randomized sampling allocation events.
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Dec 20, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

randomizedallocationsampling tests are failing on nativeaot

4 participants

@noahfalk@MichalStrehovsky@jkotas@tommcdon