Skip to content

[FEA]: Debugger pretty-printers: cuda::mr::shared_resource - #10229

Merged
Jacobfaib merged 4 commits into
NVIDIA:mainfrom
ecgang:th/cccl-10101
Aug 27, 2026
Merged

Jacobfaib merged 4 commits into
NVIDIA:mainfrom
ecgang:th/cccl-10101

Conversation

@ecgang

@ecgang ecgang commented Jul 26, 2026 •

Copy link
Copy Markdown
Contributor

Closes #10101

Description

Adds GDB and LLDB pretty-printers for cuda::mr::shared_resource, alongside the existing
memory_resource printers.

Each prints the public type name and the reference count read from the control block's
atomic. LLDB registers a synthetic child provider next to the summary and the GDB printer
yields children, so a handle expands to a resource child holding the address of the owned
resource: two handles to the same resource are distinguishable at a glance, and the address
appears once rather than in both places. This follows the way std::shared_ptr splits the
counts into the summary and the pointer into a child. The child is the address rather than
the resource object, which keeps the ABI inline namespace and the resource's private members
out of the goldens.

An empty (moved-from) handle keeps the fields in the same places, use_count=0, resource=nullptr, and a resource with no load address reads resource=<invalid address>.

Both debugger entry points register the new module. A libcudacxx_add_pretty_printer_test()
scenario covers a unique handle, a handle reached through a type alias, and copy and move
inspected on the same variable before and after the operation, so the goldens show the
debuggers refreshing one object's state rather than serving what they cached.

Verification: both debugger tests were run for real (the dev machine has no GPU) in an
aarch64 Linux container — nvcc 13.0.88, gdb 15.1, lldb 18.1.3 — invoking
run_pretty_printer_test.py with the argument shape libcudacxx_add_pretty_printer_test()
generates, with libcuda.so.1 stubbed (the binaries reach only cuInit and
cuDeviceGetCount through cuGetProcAddress; no compared byte originates from the driver,
and the harness normalizes addresses). Both shared_resource goldens matched observed output
byte-for-byte with golden updating turned off, and the existing memory_resource scenario
passes unchanged under the same setup as a control.

The one path not exercised locally is the CMake registration itself (a full configure needs
lit and a GPU-runner environment), so a CI run is what proves that wiring.

Rebased onto 9ef513d9c5 on 2026-08-27, 144 commits on from the previous base. Git reported
three conflicts, all additive registry lists: the gdb/ and lldb/ __init__.py printer
tables and the add_subdirectory list in test/debugging/CMakeLists.txt. The rest of the
range was checked by hand rather than assumed, because the things that move under a printer
do not conflict: the control-block layout this reads (__payload, __ref_count,
cuda::std::atomic's __a.__a_value), every cccl_common helper the two modules import,
and run_pretty_printer_test.py's --case arity are all unchanged. make_shared_resource
gained [[nodiscard]] in that range; every call in source.cu already binds its result.

Both scenarios were re-run under the container described above against the committed
goldens, with golden updating off and memory_resource as an untouched control: all four
combinations pass byte-for-byte, so no .expected file needed regenerating. The full CI
matrix has not run since the rebase.

Checklist

  • New or existing tests cover these changes.
  • The documentation is up to date with these changes. (docs/cccl/development/debugger_setup.rst enumerates the printer directories, not individual types, so no doc edit is needed.)

This contribution was developed with AI assistance via terminalhire. The author has reviewed the change and takes responsibility for its content.

@ecgang
ecgang requested review from a team as code owners July 26, 2026 13:59
@ecgang
ecgang requested a review from Jacobfaib July 26, 2026 13:59
@github-project-automation github-project-automation Bot moved this to Todo in CCCL Jul 26, 2026
@copy-pr-bot

copy-pr-bot Bot commented Jul 26, 2026

Copy link
Copy Markdown
Contributor

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@cccl-authenticator-app cccl-authenticator-app Bot moved this from Todo to In Review in CCCL Jul 26, 2026
@coderabbitai

coderabbitai Bot commented Jul 26, 2026 •

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 7c83a05c-f285-41eb-8fdb-c42307367730

📥 Commits

Reviewing files that changed from the base of the PR and between 9ef513d and 3381ae2.

📒 Files selected for processing (9)
  • libcudacxx/share/libcudacxx/gdb/__init__.py
  • libcudacxx/share/libcudacxx/gdb/shared_resource.py
  • libcudacxx/share/libcudacxx/lldb/__init__.py
  • libcudacxx/share/libcudacxx/lldb/shared_resource.py
  • libcudacxx/test/debugging/CMakeLists.txt
  • libcudacxx/test/debugging/shared_resource/CMakeLists.txt
  • libcudacxx/test/debugging/shared_resource/gdb.expected
  • libcudacxx/test/debugging/shared_resource/lldb.expected
  • libcudacxx/test/debugging/shared_resource/source.cu
🚧 Files skipped from review as they are similar to previous changes (9)
  • libcudacxx/share/libcudacxx/gdb/init.py
  • libcudacxx/share/libcudacxx/lldb/init.py
  • libcudacxx/test/debugging/CMakeLists.txt
  • libcudacxx/test/debugging/shared_resource/gdb.expected
  • libcudacxx/test/debugging/shared_resource/lldb.expected
  • libcudacxx/test/debugging/shared_resource/source.cu
  • libcudacxx/share/libcudacxx/lldb/shared_resource.py
  • libcudacxx/test/debugging/shared_resource/CMakeLists.txt
  • libcudacxx/share/libcudacxx/gdb/shared_resource.py

Included review availability: Your plan provides up to 12 included reviews per hour; 11 remain after this review.


📝 Walkthrough

Summary by CodeRabbit

  • New Features
    • Added debugger support for inspecting cuda::mr::shared_resource in both GDB and LLDB.
    • Debugger views now display whether the resource is empty, the current use_count, and the underlying resource address when available.
    • Improved visibility into resource ownership and moved-from states during debugging.
  • Tests
    • Added coverage for unique, aliased, copied, and moved resource scenarios in both debuggers.

Walkthrough

Changes

Adds GDB and LLDB pretty-printers for cuda::mr::shared_resource. Registers both printers and adds debugger tests for unique, aliased, copied, moved, and empty states.

shared_resource pretty-printers

Layer / File(s) Summary
GDB printer implementation
libcudacxx/share/libcudacxx/gdb/*
Matches shared_resource types, formats control-block state, registers the printer, and exposes the owned resource child.
LLDB formatter implementation
libcudacxx/share/libcudacxx/lldb/*
Recognizes shared_resource values, formats reference counts and resource addresses, registers the summary, and provides a synthetic child.
Debugger lifecycle coverage
libcudacxx/test/debugging/*, libcudacxx/test/debugging/shared_resource/*
Adds the test target, CUDA inspection scenarios, and expected GDB and LLDB output for resource state transitions.

Assessment against linked issues

Objective Addressed Explanation
Add GDB and LLDB pretty-printers under the specified paths and exhaustive tests under libcudacxx/test/debugging/shared_resource. [#10101] ✅

Merge Risk: ⚪ Minimal · up to 3381a

This PR adds localized GDB and LLDB pretty-printers for cuda::mr::shared_resource with accompanying tests and registration. No actionable merge-blocking risk remains beyond normal checks and review.


Comment @coderabbitai help to get the list of available commands.

@Jacobfaib

Copy link
Copy Markdown
Contributor

/ok to test 6a96e8a

@github-actions

This comment has been minimized.

@ecgang

ecgang commented Jul 26, 2026

Copy link
Copy Markdown
Contributor Author

Note for reviewers: the two red Build RAPIDS (optional) jobs are an upstream conda solve conflict, not a failure of this change.

Both fail before any compilation, at environment creation:

error libmamba Could not solve for environment specs
    ├─ cuda-version =13.3 * is requested and can be installed;
    ├─ dlpack >=1.0,<1.1 * is requested and can be installed;
    └─ libcudf =26.10,>=0.0.0a0 * is not installable because there are no viable options
       ├─ libcudf [...] would require cuda-version >=12,<13.0a0 *
       └─ libcudf [...] would require dlpack >=0.8,<1.0 *

The available libcudf 26.10 nightlies still pin cuda-version <13.0a0 and dlpack <1.0, which conflicts with the requested CUDA 13.3. Re-running will fail the same way until RAPIDS publishes CUDA 13 builds.

This PR adds Python pretty-printer modules and a debugging lit test; it touches no headers RAPIDS compiles against. The rest of the matrix is green (100%/71, 85 successful checks).

@miscco miscco 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.

Thanks a lot for improving the debugging experience 🎉

@Jacobfaib Jacobfaib 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.

Thank you for the patch! Just a few minor fixups required

inspect_shared(second_reference);
inspect_alias(aliased_resource);
inspect_moved_into(moved_resource);
inspect_moved_from(donor_resource);

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.

Can you include a scenario where a shared resource is inspected before and after it is copied? I.e.

auto resource = ...;

inspect(resource);
auto copy = resource;
inspect(resource);
inspect(copy);

and the same for move? I realize you have similar scenarios already, but we want to make sure that the debuggers update the information for the same object before and after. LLDB pretty printers for example cache the output.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Added, for both operations. inspect_before_copy and inspect_after_copy print the same variable, copy_source, on either side of copy_target = copy_source, so its use count has to read 1 then 2; the second stop also prints copy_target. The move pair does the same for move_source, which goes from owning to empty, and prints move_target at the second stop.

The old shared, moved_into, and moved_from cases fold into these pairs, since they pinned the same states without showing that the debuggers refresh them.

return _SHARED_RESOURCE_PATTERN.fullmatch(type_name) is not None


def shared_resource_summary(

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.

This should be a proper pretty printer, not just a summary. Its output should be modeled like std::shared_ptr.

This is probably based on the summary printer for the regular resource, but that needed a summary because gdb/lldb don't play nice when sub-printers produce newlines (so e.g. in buffer, we show the memory resource but need to do so without newlines).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Done. LLDB now registers a synthetic provider next to the summary, and the GDB printer grew a matching children(). Both expose the owned resource as a resource child, so a handle can be expanded to reach the resource it owns, while the summary keeps carrying the use count and the address the way std::shared_ptr keeps strong=/weak= in its summary and the pointer in its child.

The child is the address rather than the resource itself, deliberately: yielding the payload object made GDB print the whole resource inline, which put cuda::mr::__4::, static __available_flags, and the resource private members into the golden file. That is exactly what public_type_name() exists to keep out, and it would break the test on an ABI namespace bump. One extra expansion step gets you the same drill-down without pinning any of it.

The summary is registered with --expand so frame variable shows the child, and update() returns False so LLDB re-reads after a copy or a move instead of serving what it cached.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

One correction to what I wrote above: the follow-up commit takes the address out of the summary as well, so it now appears once, in the resource child, instead of in both places. The summary carries use_count=N for an owning handle, which is closer to how std::shared_ptr splits the two.

The two formats you asked for are unaffected: an empty handle still reads use_count=0, resource=nullptr, and a resource with no load address still reads use_count=N, resource=<invalid address>.

Comment on lines +57 to +58
if address == lldb.LLDB_INVALID_ADDRESS:
return f"{type_name} use_count={use_count}"

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.

We should print the address nonetheless, something like <invalid address>.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Now prints resource=<invalid address>. Both printers carry a comment noting the branch guards an unreadable frame rather than any state this scenario reaches, since the harness always builds at -O0 -g and a control block reached through a live pointer always has an address.

Comment on lines +41 to +42
if control_block.GetValueAsUnsigned(0) == 0:
return f"{type_name} empty"

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.

We should still print the information in the same format as normal. So type_name={type_name} use_count=0, resource=nullptr

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Both printers now report an empty handle as cuda::mr::shared_resource<...> use_count=0, resource=nullptr.

I read "the same format as normal" as keeping the bare type name that the non-empty branch already prints, so there is no literal type_name= label in front of it. Say the word if you meant the label and I will add it to both branches in both printers.

@github-project-automation github-project-automation Bot moved this from In Review to In Progress in CCCL Jul 27, 2026

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 1


ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: ff11c9d8-8d21-4bff-83d1-a1863aed1692

📥 Commits

Reviewing files that changed from the base of the PR and between 6a96e8a and 0a2020e.

📒 Files selected for processing (6)
  • libcudacxx/share/libcudacxx/gdb/shared_resource.py
  • libcudacxx/share/libcudacxx/lldb/shared_resource.py
  • libcudacxx/test/debugging/shared_resource/CMakeLists.txt
  • libcudacxx/test/debugging/shared_resource/gdb.expected
  • libcudacxx/test/debugging/shared_resource/lldb.expected
  • libcudacxx/test/debugging/shared_resource/source.cu
🚧 Files skipped from review as they are similar to previous changes (3)
  • libcudacxx/test/debugging/shared_resource/CMakeLists.txt
  • libcudacxx/test/debugging/shared_resource/lldb.expected
  • libcudacxx/share/libcudacxx/gdb/shared_resource.py

return False

def num_children(self) -> int:
return 1 if self.resource.IsValid() else 0

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.

Nit: can reuse has_children() here, or rework has_children() to reuse num_children()

Comment on lines +2 to +3
cuda::mr::shared_resource<cuda::mr::legacy_managed_memory_resource> use_count=1, resource=<address> = {
resource = <address>

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.

We don't need to print resource=... in the summary now that we have it in the brackets

Comment on lines +2 to +3
(const shared_resource_type) cuda::mr::shared_resource<cuda::mr::legacy_managed_memory_resource> use_count=1, resource=<address> {
resource = <address>

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.

Ditto printing resource twice

@Jacobfaib

Copy link
Copy Markdown
Contributor

/ok to test 0a2020e

@github-actions

This comment has been minimized.

@ecgang

ecgang commented Jul 29, 2026

Copy link
Copy Markdown
Contributor Author

All four review points are addressed, across 0a2020e (which your /ok to test took through the matrix at 71/71) and 15300fd on top of it.

15300fd is a follow-up to the pretty-printer point: the address was landing in both the summary and the new resource child, so it now appears once, in the child, and the summary carries use_count=N. It touches only the two printer modules and the two .expected goldens — no headers, no CMake, no test source. Both debuggers were re-run against the checked-in goldens (gdb 15.1, lldb 18.1.3, nvcc 13.0.88), and the untouched memory_resource scenario passes alongside as a control.

Ready for /ok to test 15300fd whenever you are. One open question is waiting on the empty-handle thread: I kept the bare type name that the non-empty branch prints rather than a literal type_name= label, and switching it is a one-line change in both printers if you meant the label.

@Jacobfaib Jacobfaib 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.

LGTM, thanks for the contribution!

@github-project-automation github-project-automation Bot moved this from In Progress to In Review in CCCL Jul 29, 2026
@Jacobfaib

Copy link
Copy Markdown
Contributor

/ok to test 15300fd

@Jacobfaib
Jacobfaib enabled auto-merge (squash) July 29, 2026 12:12
@github-actions

This comment has been minimized.

auto-merge was automatically disabled July 31, 2026 19:59

Head branch was pushed to by a user without write access

@Jacobfaib

Copy link
Copy Markdown
Contributor

@ecgang can you rebase your branch over latest main please?

@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

@ecgang

ecgang commented Aug 12, 2026

Copy link
Copy Markdown
Contributor Author

@Jacobfaib rebased onto latest main.

The conflicts git reported were just the printer registries and the add_subdirectory list. Three other upstream changes needed adapting, which is what the last commit does:

  • --case dropped its frame index and now evaluates in the breakpoint's own frame, so the cases name the parameter and two of them split into their own breakpoints.
  • The type helpers moved from memory_resource to cccl_common.
  • cuda::std::atomic's new LLDB synthetic provider hides the raw __a.__a_value the use count reads, so it goes through GetNonSyntheticValue() now.

Goldens regenerated under gdb 15.1 and lldb 18.1.3, then re-verified against the untouched memory_resource scenario as a control. The GDB golden is unchanged.

Needs a /ok to test for the new SHA when you get a chance.

@Jacobfaib

Copy link
Copy Markdown
Contributor

@ecgang sorry I totally missed that this never merged. Can you rebase again and I will make sure it gets in this time.

ecgang and others added 4 commits August 27, 2026 11:10
Summarize shared ownership instead of the raw control block: the printers
report the public type, the reference count read from the control block's
atomic, and the address of the wrapped resource, so two handles to the same
resource are distinguishable at a glance. A moved-from handle renders as
empty.

Registers the new module in both entry points and adds a pretty-printer
scenario covering the unique, shared, aliased, moved-into, and moved-from
states.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Make the LLDB formatter a real pretty printer: a synthetic provider now sits
next to the summary, and the GDB printer grew a matching children(). Both
expose the owned resource as a `resource` child, the way std::shared_ptr
exposes its pointer, so a handle can be expanded to reach the resource it
owns. The child is the address rather than the resource itself, which keeps
the ABI inline namespace and the resource's private members out of the
output. LLDB's provider reports no caching, so a copy or a move is picked up
on the next stop instead of being served from what LLDB already computed.

Report an empty handle in the normal format, `use_count=0, resource=nullptr`,
rather than as `empty`, and print `<invalid address>` when the owned resource
has no load address, so the fields are always in the same places.

Cover copying and moving on the same variable across two stops: the copy pair
prints `copy_source` on either side of the copy, so its use count has to go
1 -> 2, and the move pair prints `move_source` going from owning to empty.
Both stops also print the new handle. These replace the old shared,
moved-into, and moved-from cases, which pinned the same states without
showing that the debuggers refresh them.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…e summary

The summary printed the owned resource's address next to the use count, and
the `resource` child then printed it again. Keep it in the child alone, so a
handle reads `use_count=N` and expands to the resource, the way
std::shared_ptr keeps strong=/weak= in its summary and the pointer in its
child.

The two states with no child keep reporting the address in the summary, since
there is nothing else to carry it: an empty handle stays
`use_count=0, resource=nullptr`, and a resource with no readable address stays
`resource=<invalid address>`.

That makes the summary depend on agreeing with the child about which state a
handle is in, so the LLDB formatters now read one signal, _resource_pointer(),
rather than asking through two different APIs. The GDB printer already
evaluates the same expression in both places.

Have num_children() ask has_children() rather than repeat the check.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Rebasing over main lands this scenario on a harness and a printer API that
both changed underneath it.

The runner no longer takes a frame index, and it evaluates each expression in
the breakpoint's own frame rather than the caller's, so every `--case` drops
its `1` and names the inspected parameter. Two of the breakpoints inspected a
second variable that only main could see; each one splits into a breakpoint of
its own, which is also how every other scenario is written. The scenario picks
up the KEEP_FOR_DEBUGGER macro that replaced the keep_for_debugger template.

The type helpers the GDB printer borrowed from memory_resource now live in
cccl_common, and memory_resource no longer exports them, so the printer imported
a name that is gone. Both printers take them from cccl_common instead, which
also gets them reference handling they now need: the value under inspection
arrives as `const T&` from the new frame convention.

Two things that only the LLDB side hits. Stripping the reference has to happen
before GetNonSyntheticValue(), or the control block reads as unavailable and
every handle summarizes as None. And the reference count is a cuda::std::atomic,
which main now formats with a synthetic `value` child, hiding the raw __a
layout; reading it through GetNonSyntheticValue() keeps this formatter off
another formatter's output.

Goldens regenerated under gdb 15.1 and lldb 18.1.3 and verified against the
untouched memory_resource scenario. The GDB golden is unchanged.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

@ecgang

ecgang commented Aug 27, 2026

Copy link
Copy Markdown
Contributor Author

No worries — rebased onto 9ef513d9c5, 144 commits on from the old base. Ready for CI:

/ok to test 3381ae23a682b769eb7515174a0f225074a76bc4

Three conflicts, all additive registry lists (the gdb/ and lldb/ __init__.py printer
tables, and the add_subdirectory list in test/debugging/CMakeLists.txt). I checked the
rest of the range by hand rather than assume it, since what a pretty-printer depends on
tends to move without conflicting — the control-block layout (__payload, __ref_count,
and cuda::std::atomic's __a.__a_value), the cccl_common helpers both modules import,
and run_pretty_printer_test.py's --case arity are all unchanged. make_shared_resource
picked up [[nodiscard]] along the way; every call in the scenario already binds its result.

Re-ran both scenarios under gdb 15.1 and lldb 18.1.3 against the committed goldens with
updating off, memory_resource alongside as an untouched control. All four pass
byte-for-byte, so nothing needed regenerating. PR description updated to match.

@Jacobfaib

Copy link
Copy Markdown
Contributor

/ok to test 3381ae2

@Jacobfaib
Jacobfaib enabled auto-merge (squash) August 27, 2026 17:25
@github-actions

Copy link
Copy Markdown
Contributor

🥳 CI Workflow Results

🟩 Finished in 56m 41s: Pass: 100%/134 | Total: 1d 06h | Max: 56m 33s | Hits: 99%/387525

See results here.

@Jacobfaib
Jacobfaib merged commit 23a267e into NVIDIA:main Aug 27, 2026
164 checks passed
charan-003 pushed a commit to charan-003/cccl that referenced this pull request Sep 15, 2026
…10229)

* [libcu++] Add debugger pretty-printers for cuda::mr::shared_resource
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

[FEA]: Debugger pretty-printers: cuda::mr::shared_resource

3 participants