Repository navigation
test(trim-paths): exercise GDB on windows-gnu - #17221
Conversation
Without the `-lines` flag, CDB disables line information and falls back to symbol matching, which can make a file-and-line breakpoint ambiguous. See <https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/cdb-command-line-options#_______-lines______>
|
r? @epage rustbot has assigned @epage. Use Why was this reviewer chosen?The reviewer was selected based on:
|
| - name: Check Windows MSVC debugger tool | ||
| run: cdb -version | ||
| if: matrix.rust == 'nightly-msvc' | ||
| - name: Check Windows GNU object tool | ||
| run: objdump --version | ||
| if: matrix.os == 'windows-latest' && matrix.rust == 'nightly-gnu' | ||
| - name: Check Windows GNU debugger tool | ||
| run: gdb --version | ||
| if: matrix.os == 'windows-latest' && matrix.rust == 'nightly-gnu' |
There was a problem hiding this comment.
I don't like these. However, we don't have a more fancier way yet to enforce tool availability in CI. Currently in #[cargo_test], requires runs during macro expansion time. If we enforce that tool's availability, jobs like clippy would also require those tools to be available.
We may want to add some feature to cargo-test-macro to skip when not running test, or we just make those tools/env globally set for the entire workflow.
I don't like either of them though
There was a problem hiding this comment.
I do appreciate for debugging purposes the ability to see related tool versions
|
|
||
| fn object_works_helper(split_debuginfo: &str, run: impl Fn(&std::path::Path) -> Vec<u8>) { | ||
| let registry_src = paths::home().join(".cargo/registry/src"); | ||
| let registry_src = paths::home().join(".cargo").join("registry").join("src"); |
There was a problem hiding this comment.
side note: I thought windows was also supposed to work with / but I've also observed this problem
Update cargo submodule 29 commits in 59800466c5c41c444d264b1010b4d57e85a7117f..3efb1f477e99b42974b982d939fd100303cdf7db 2026-07-07 15:52:22 +0000 to 2026-07-17 23:53:19 +0000 - refactor(context): normalize in `homedir` instead (rust-lang/cargo#17222) - chore(ci): reflect doc folder move in book deployment (rust-lang/cargo#17235) - refactor(ops): Have cargo-metadata's ops match the command name (rust-lang/cargo#17233) - chore: Flatten src (rust-lang/cargo#17231) - chore: Flatten `src` (rust-lang/cargo#17230) - chore(ci): remove stale libsecret packages (rust-lang/cargo#17229) - perf: Lazily initialize git2 fetch transports (rust-lang/cargo#17226) - test(trim-paths): re-enable lldb debugger tests (rust-lang/cargo#17223) - Include SBOM outputs in fingerprints (rust-lang/cargo#17216) - Update cfg_aliases to 0.2.2 (rust-lang/cargo#17225) - test(trim-paths): exercise GDB on windows-gnu (rust-lang/cargo#17221) - feat(profile): Disable incremental compilation under CI by default (rust-lang/cargo#17220) - Remove myself from review rotation (rust-lang/cargo#17219) - Fix typo in comment in sync (rust-lang/cargo#17217) - docs(ref): Improve handing of built-in profiles (rust-lang/cargo#17213) - fix: dont apply host-config gating to stable behavior (rust-lang/cargo#17198) - chore(deps): update msrv (rust-lang/cargo#17192) - test: fix race in cargo_compile_with_invalid_code_in_deps (rust-lang/cargo#17203) - Rename `-Zno-embed-metadata` to `-Zembed-metadata=no` (rust-lang/cargo#17149) - fix(source): incorrect duplicate package warning (rust-lang/cargo#17204) - Fix manifest schema generation: `TomlDebugInfo` enum-variants doesn't renamed (rust-lang/cargo#17202) - Reduce library search path length in new build dir layout (rust-lang/cargo#17191) - fix(install): Move --debug to Compilation options (rust-lang/cargo#17199) - chore(ci): dogfood `build.warnings` (rust-lang/cargo#17195) - docs(lints): Better match clippy in lint section titles (rust-lang/cargo#17190) - chore: bump to 0.100.0; update changelog (rust-lang/cargo#17189) - docs(ref): Clarify MSRV for lints (rust-lang/cargo#17184) - docs(report): add missing entry for `cargo report future-incompatibilities` (rust-lang/cargo#17188) - Reduce rustc `-L` args used in the new `build-dir` layout (rust-lang/cargo#17168)
Update cargo submodule 29 commits in 59800466c5c41c444d264b1010b4d57e85a7117f..3efb1f477e99b42974b982d939fd100303cdf7db 2026-07-07 15:52:22 +0000 to 2026-07-17 23:53:19 +0000 - refactor(context): normalize in `homedir` instead (rust-lang/cargo#17222) - chore(ci): reflect doc folder move in book deployment (rust-lang/cargo#17235) - refactor(ops): Have cargo-metadata's ops match the command name (rust-lang/cargo#17233) - chore: Flatten src (rust-lang/cargo#17231) - chore: Flatten `src` (rust-lang/cargo#17230) - chore(ci): remove stale libsecret packages (rust-lang/cargo#17229) - perf: Lazily initialize git2 fetch transports (rust-lang/cargo#17226) - test(trim-paths): re-enable lldb debugger tests (rust-lang/cargo#17223) - Include SBOM outputs in fingerprints (rust-lang/cargo#17216) - Update cfg_aliases to 0.2.2 (rust-lang/cargo#17225) - test(trim-paths): exercise GDB on windows-gnu (rust-lang/cargo#17221) - feat(profile): Disable incremental compilation under CI by default (rust-lang/cargo#17220) - Remove myself from review rotation (rust-lang/cargo#17219) - Fix typo in comment in sync (rust-lang/cargo#17217) - docs(ref): Improve handing of built-in profiles (rust-lang/cargo#17213) - fix: dont apply host-config gating to stable behavior (rust-lang/cargo#17198) - chore(deps): update msrv (rust-lang/cargo#17192) - test: fix race in cargo_compile_with_invalid_code_in_deps (rust-lang/cargo#17203) - Rename `-Zno-embed-metadata` to `-Zembed-metadata=no` (rust-lang/cargo#17149) - fix(source): incorrect duplicate package warning (rust-lang/cargo#17204) - Fix manifest schema generation: `TomlDebugInfo` enum-variants doesn't renamed (rust-lang/cargo#17202) - Reduce library search path length in new build dir layout (rust-lang/cargo#17191) - fix(install): Move --debug to Compilation options (rust-lang/cargo#17199) - chore(ci): dogfood `build.warnings` (rust-lang/cargo#17195) - docs(lints): Better match clippy in lint section titles (rust-lang/cargo#17190) - chore: bump to 0.100.0; update changelog (rust-lang/cargo#17189) - docs(ref): Clarify MSRV for lints (rust-lang/cargo#17184) - docs(report): add missing entry for `cargo report future-incompatibilities` (rust-lang/cargo#17188) - Reduce rustc `-L` args used in the new `build-dir` layout (rust-lang/cargo#17168)
*[View all comments](https://triagebot.infra.rust-lang.org/gh-comments/rust-lang/cargo/pull/17488)* # Stabilization report: `profile.trim-paths` Resolves rust-lang#12137 Resolves rust-lang/rust#111540 RFC: <https://rust-lang.github.io/rfcs/3127-trim-paths.html> ## What is stabilized The rustc side `--remap-path-scope` was already stabilized in Rust 1.95 via rust-lang/rust#147611 This stabilizes the Cargo side: * `profile.<name>.trim-paths = "none" | "object" | "all"` in both manifest and config * The remap rules of how Cargo passes `--remap-path-{prefix,scope}`. The exact remap prefixes still stay unspecified. * The unremap file `<artifact>.trim-paths.json` (schema v1), which is emitted beside final artifacts when debuginfo is on. * `CARGO_TRIM_PATHS_SCOPE` and `CARGO_TRIM_PATHS_REMAP` for build scripts. When this is merged and sync in rust-lang/rust, we'll also stabilize * The `rust-gdb` and `rust-lldb` unremap loaders. `RUST_GDB_TRIM_PATHS=unstable` and `RUST_LLDB_TRIM_PATHS=unstable` are not needed anymore. See doc for details: https://github.com/rust-lang/cargo/blob/8814ead110e36ed8fdcf1fdd4009baf82bd78523/doc/book/src/reference/unstable.md?plain=1#L1441-L1645 ## What is not stabilized / included * This doesn't guarantee full sanitization. It is a best-effort feature. * Other `--remap-path-scope` values in rustc (`macro`, `diagnostics`, `debuginfo`, `coverage`), boolean values, and comma-separated list options. These are removed in rust-lang#17432. They can come back later when needed. * A default trim-path value for built-in profiles. RFC originall proposed to set `release` to `"object"`. This is left for future when this is more adopted and battle-tested. We have loose stability guarantee for changing profile settings anyway. * `__CARGO_RUSTC_BOOTSTRAP_WS_REMAP`. This stays as an internal thing between rustc bootstrap and cargo (see rust-lang#17349, rust-lang#17366) * Doctest remapping and `documentation` scope. This will be integrated in the future incrementally when those scopes and features are stable. * The exact remap prefixes are unspecified as documented. However, in practice, rustc bootstrap and debugger depend on the stabilized shape, so any change needs careful coordination with them. * Unremap files for artifact deps: deferred, non-blocking. * `build-rs` API for the two build script variables: deferred, non-blocking. * If there are new kinds of artifacts, we can decide whether to remap freely. ### Doors closed * The trim-paths profile key name, its shape, and its options. * The unremap file name suffix `.trim-paths.json` and the v1 schema. * The environment variable `CARGO_TRIM_PATHS_SCOPE` and `CARGO_TRIM_PATHS_REMAP`. ## Post-RFC changes * rustc removed `split-debuginfo` scopes, and Cargo followed and stopped caring split debuginfo. * The RFC remapped the current package to relative paths and every dependency to `<name>-<version>`. In rust-lang#17302 we chose workspace members relative remap, so debuggers resolve workspace sources with zero configuration. The RFC worried that relative paths only work when running from the right directory, and symbolication tools need a second process for joining workspace relative paths. THe unremap file has `workspace_root`, so the join is fairly mechanical. Remap prefixes are unspecified anyway, so we can still change if it turns out not ideal. * The unremap file is new (introduced in rust-lang#17303), for helping debugging find sources, as well as our keeping remap rules unspecified. The RFC had no answer about this. * `CARGO_TRIM_PATHS_REMAP` build script env is new. It lets build scripts forward the same rules to C/C++ compilers to flags like `-fmacro-prefix-map`. `cc-rs` has integrated that since rust-lang/cc-rs#1794. ## Feedback * rustc bootstrap builds the compiler and standard library with `trim-paths` via rust-lang/rust#161049 since 2026-09-02. This exercises the sysroot remap and the workspace prefix override in rust-lang/rust CI. * `cc-rs` forwards the remap rules to C/C++ compiler since 1.3.0: <https://github.com/rust-lang/cc-rs/releases/tag/cc-v1.3.0> * Zulip thread: [#t-cargo > stabilization plan for &rust-lang#96;-Ztrim-paths&rust-lang#96;](https://rust-lang.zulipchat.com/#narrow/channel/246057-t-cargo/topic/stabilization.20plan.20for.20.60-Ztrim-paths.60/with/622955580) * Call for testing posted on 2026-09-09 * rust-lang#12137 (comment) * Included in TWiR issue 669 <https://this-week-in-rust.org/blog/2026/09/16/this-week-in-rust-669/> ## Known limitations This sanitization is best-effort. See * rustc: <https://doc.rust-lang.org/rustc/remap-source-paths.html#caveats-and-limitations> * Cargo: <https://github.com/rust-lang/cargo/blob/8814ead110e36ed8fdcf1fdd4009baf82bd78523/doc/book/src/reference/unstable.md?plain=1#L1603-L1626> ## Implementation ### History | PR | Merged | Title | |--------|------------|-------------------------------------------------| | rust-lang#12625 | 2023-10-31 | implement RFC 3127 `-Ztrim-paths` | | rust-lang#12900 | 2023-10-31 | set env `CARGO_TRIM_PATHS` for build scripts | | rust-lang#12908 | 2023-11-02 | merge `trim-paths` from different profiles | | rust-lang#13118 | 2023-12-06 | assert `OSO` and `SO` cannot be trimmed | | rust-lang#14389 | 2024-08-12 | rustdoc supports trim-paths for diagnostics | | rust-lang#14908 | 2024-12-09 | use Path::push to construct remap-path-prefix | | rust-lang#14917 | 2024-12-11 | use stable hash from rustc-stable-hash | | rust-lang#15614 | 2025-06-02 | remap all paths to `build.build-dir` | | rust-lang#15621 | 2025-06-02 | enable more tests for windows-msvc | | rust-lang#16536 | 2026-01-21 | `--remap-path-scope` stabilized in 1.95-nightly | | rust-lang#17104 | 2026-06-15 | emit `CARGO_TRIM_PATHS_REMAP` for build.rs | | rust-lang#17221 | 2026-07-15 | exercise GDB on windows-gnu | | rust-lang#17302 | 2026-08-03 | unambiguous and reversible remap rules | | rust-lang#17303 | 2026-08-04 | emit unremap files for final artifacts | | rust-lang#17326 | 2026-08-07 | exercise unremap files with debuggers | | rust-lang#17338 | 2026-08-08 | `/cargo/deps` fallback sources | | rust-lang#17337 | 2026-08-10 | workspace remap under -Zroot-dir | | rust-lang#17349 | 2026-08-11 | honor workspace prefix override from env | | rust-lang#17366 | 2026-08-26 | custom workspace-relative member paths remap | | rust-lang#17424 | 2026-09-02 | remove default scope from release profile | | rust-lang#17425 | 2026-09-02 | docs: add limitations and polish | | rust-lang#17432 | 2026-09-04 | limit options to `none\|object\|all` | | rust-lang#17476 | 2026-09-15 | unremap file in one JSON doc | | rust-lang#17491 | 2026-09-21 | `build-rs` support | ### Test coverage * Remap for each dependency kind * `"object"` with every `split-debuginfo` mode * `"all"` diagnostics remapping for rustc and rustdoc * The new build-script environment variables. * Real world debugger exercises with GDB, LLDB, and CDB * unremap files with rebuilds, `cargo clean`, JSON messages * rustc bootstrap workspace prefix override * `-Zbuild-std` backtraces show `/rustc/<hash>` paths ## Follow-ups after stabilization * [ ] Revisit reproducibility issues, such as * rust-lang#13586 * rust-lang#15122 * rust-lang#7645 * rust-lang#10915 Absolute paths of workspace and `CARGO_HOME` still get into `-Cmetadata`/`-Cextra-filename`/fingerprints. With `trim-paths = "object"` we might be able to also trim paths in those places. * [ ] Revisit a new default for built-in profiles e.g., `release` * [ ] In rust-lang/rust stabilize loader logic in `src/etc/gdb_trim_paths.py` and `src/etc/lldb_trim_paths.py` * [x] A new issue for `build-rs` adding `CARGO_TRIM_PATHS_SCOPE` and `CARGO_TRIM_PATHS_REMAP` support * [ ] A new issue for supporting doctest remapping and documentation scope. * [ ] Track unremap files support in artifact dependencies tracking issue --- 🤖 LLM disclosure: impl history was generated. heading was generated. meats are human-written.
What does this PR try to resolve?
I want to add all trim-paths debugger tests back.
Starting from Windows:
Part of #12137
How to test and review this PR?
Hope it looks correct. Finally got this working on a Windows VM :)