Skip to content

Merge 'main' into 'release-cpptools'#1564

Merged
WardenGnaw merged 10 commits into
release-cpptoolsfrom
main
May 21, 2026
Merged

Merge 'main' into 'release-cpptools'#1564
WardenGnaw merged 10 commits into
release-cpptoolsfrom
main

Conversation

@WardenGnaw
Copy link
Copy Markdown
Member

No description provided.

WardenGnaw and others added 10 commits April 4, 2026 10:54
bypass -data-read-memory-bytes when using lldb together with coredump
When attaching to a process via SSH, the debugger hung at 'Initializing
debugger' because readlink was sent through GDB's MI interface which has
no timeout. ExecuteSyncCommand on the SSH port did not exist when this
code was written (PR #432), but was added two weeks later (PR #446).

Changes:
- DebuggedProcess.cs: Run readlink/lsof directly via the SSH port's
  ExecuteSyncCommand with a 30s timeout instead of GDB's MI interface.
  The -file-exec-and-symbols command still goes through GDB.
- AD7Port.cs: Skip VS wait dialog when ExecuteSyncCommand is called
  from a background thread (debugger worker thread hits an assert
  otherwise).
- ResourceStrings: Add localized strings for progress and error
  messages (timeout, non-zero exit code).
* Add VS feedback tool integration for MIEngine diagnostic logs

Attach MIEngine diagnostic logs to VS "Report a Problem" feedback reports
via IFeedbackDiagnosticFileProvider (MEF export).

- FeedbackLogBuffer: always-on 256KB circular buffer with sequence-tracked
FlushNewEntries() to prevent duplicate entries across consumers
- VSFeedbackLogger: FileSystemWatcher monitors feedback semaphore file;
when VS starts "Record Steps", opens a StreamWriter and dumps buffered
entries plus live-streams new ones
- FeedbackDiagnosticFileProvider: MEF export discovered by VS feedback
tool; flushes new buffer entries to temp file (MIEngine-{pid}.log) and
returns the path
- IL reference assembly for IFeedbackDiagnosticFileProvider interface
  (package is on Azure-Public but we cant have multifeeds)
* Add support for HitCount and HitCondition

This PR adds in showing the Hit count for a breakpoint and for setting a
HitCondition.

Enables m_supportsHitConditionalBreakpoints, OpenDebugAD7 now properly
builds a AD7BreakpointRequest with a hitCondition, AD7BoundBreakpoint
now properly tracks hits and will prevent a break event if theres a
condition set.

Added CppTests and updated DebuggerTesting for associated commands.

Addresses: #472

* Use -break-after

* Handle updating hitCondition when with hitCount > 0

* Address PR issues

* Re-add ShouldBreak()
* Strip Windows dll!-qualified module prefixes before GDB/LLDB evaluation

Expressions in NatVis files often reference Windows-specific module
prefixes such as Qt6Cored.dll! to disambiguate types. These prefixes
are meaningless to GDB and LLDB and cause evaluation failure on
Linux/macOS. ReplaceNamesInExpression now strips them before any
expression is sent to the debugger.

* Natvis: implement <Intrinsic> support for GDB/LLDB

NatVis <Intrinsic> elements define named inline expressions that can be
called by name in any subsequent expression within the same <Type> block.
MIEngine previously ignored them silently; this change makes them work.

* Natvis: address review comments on intrinsic support PR

- Rename ParameterType -> IntrinsicParameterType in natvis.xsd and
  NatvisXsdTypes.cs to match the Visual Studio natvis.xsd
- Make Intrinsics property get-only (assigned only in constructor)
- Rename s_dllQualifiedPrefix -> s_moduleQualifiedPrefix; extend regex
  to match .exe! in addition to .dll!, add RegexOptions.IgnoreCase,
  and use non-capturing groups
- Broaden s_intrinsicCallPattern identifier from [A-Za-z_]\w* to \w+
  to support non-Latin identifiers

* Natvis: fix ParameterType rename in unit tests

NatvisIntrinsicTest.cs was not updated when ParameterType was renamed
to IntrinsicParameterType in the review-comments commit, causing build
failures on Windows CI.
Enable disabled DAR Linux tests (CppTests)

Re-enable 5 tests on GitHub Linux runners:
- CoreDumpBasic, CoreDumpBasicMismatchedSourceAndSymbols, CoreDumpVerifyActions
- ExecutionAsyncBreak
- RunModeBreakpoints

CI changes:
- Set kernel.core_pattern=core so dumps land in CWD (debuggee output dir)
- Set core_uses_pid=0 (test expects file named 'core', no PID suffix)
- Disable apport service which intercepts core dumps on Ubuntu
- Run tests in subshell with ulimit -c unlimited (scoped, resets on exit)

Test fixes (latent bugs in previously-disabled tests):
- CoreDumpVerifyActions: Assert.Contains args were inverted. xUnit signature
  is (expectedSubstring, actualString) but the test had them backwards.
- ExecutionAsyncBreak: Test was sending pause before the inferior was running.
  Use a function breakpoint to confirm the loop is executing, then continue
  and async break. Also fix shouldExit access via 'this' (member variable).

Relates to: #1170

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The condition guard was using IsNullOrWhiteSpace instead of
!IsNullOrWhiteSpace, which meant LinkedListItems with a Condition
attribute were never filtered — items were always shown regardless
of the condition value.

Added an integration test (TestLinkedListItemsCondition) that
creates two ConditionalLinkedList objects — one with isActive=true
and one with isActive=false — and verifies that the natvis
LinkedListItems Condition attribute is respected.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add configurable debuginfod settings to prevent GDB hangs

## Why is this change being made?

Fixes microsoft/vscode-cpptools#14458

MIEngine commit f169b02 added `set debuginfod enabled on` unconditionally in
GetInitializeCommands(). On systems where DEBUGINFOD_URLS points to an
unreachable server (e.g. debuginfod.ubuntu.com which is currently down),
subsequent GDB commands block for 90+ seconds waiting for the network request
to time out, causing GDB to appear hung on launch.

## Summarize what changed

- Added a `debuginfod` launch option (JSON: `{ enabled: bool, timeout: int }`
  XML: `EnableDebuginfod`/`DebuginfodTimeout` attributes) defaulting to
  enabled with a 30-second timeout.
- When enabled (timeout > 0): sets DEBUGINFOD_TIMEOUT and DEBUGINFOD_MAXTIME
  environment variables on the GDB process to cap network requests.
- When enabled (timeout = 0): no timeout override is applied; GDB/libdebuginfod
  defaults are used.
- When disabled: clears DEBUGINFOD_URLS on the GDB process so debuginfod
  connections are never attempted, even if the system has the env var set.
- `set debuginfod enabled on` is now conditional on the EnableDebuginfod setting.
- Added XSD schema validation (minInclusive=0) and JSON schema (minimum: 0).
- Negative timeout values are clamped to the default (30) at runtime.

## How was the change tested?

- [x] Changes reviewed by Copilot CLI (using /review)
- [x] All 36 MICoreUnitTests pass
- [x] Integration tests (DebuginfodTests) pass in WSL with GDB 12.1:
      - DebuginfodDisabledDoesNotHang: steps into std::regex with unreachable
        server, verifies launch completes in < 10s
      - DebuginfodTimeoutPreventsHang: steps into std::regex with 5s timeout,
        verifies launch completes in < 30s
- [x] All existing CppTests pass (Sample, Execution, Breakpoint, Environment)
- [x] Verified via TCP listener that debuginfod URLs are actually queried
      during step-into-library operations
@WardenGnaw WardenGnaw merged commit 62aebe0 into release-cpptools May 21, 2026
2 checks passed
Sign up for free to 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.

3 participants