aethersdr / aethersdr/AetherSDR

Package matching Qt and native DLL symbols for Partner Center crash reports

Open
#4,258 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

enhancement maintainer-review Windows
Dominant language
C++
Stars
221
Forks
117
Avg merge
2d 7h
Merged PRs (30d)
299

Description

Problem

Partner Center is reporting many Windows crash and hang clusters as !unknown, especially failures whose faulting image is a Qt DLL or Qt Windows platform plug-in.

A recent high-value cluster involved window reparenting on Intel GPUs through Qt, but the available stack was not sufficiently symbolicated to identify the Qt function path.

AetherSDR currently puts only build/AetherSDR.pdb into the Store .appxsym. The shipped MSIX also contains Qt DLLs, Qt plug-ins, qtkeychain, FFmpeg, FFTW, and other native libraries, but their matching PDBs are absent. Failures attributed to those images therefore remain !unknown even though the application PDB is present.

Evidence

The published v26.7.2 upload has the expected outer structure:

  • AetherSDR-26.7.2.0-Windows-x64.msix
  • AetherSDR-26.7.2.0-Windows-x64.appxsym

However, the .appxsym contains only:

  • AetherSDR.pdb

The current New-AppxSym implementation also accepts and copies a single PdbPath.

Microsoft matches PDBs to EXE/DLL images using the embedded GUID and age, so each symbol file must come from the exact build of the shipped binary. A rebuilt or merely version-matched PDB is insufficient.

References:

Proposed work

  • Install Qt's matching debug_info package for the exact Qt version/toolchain used by the Windows release build.
  • Collect PDBs corresponding to the EXE and every deployed DLL/plug-in for which symbols are available.
  • Include those PDBs in the single architecture-specific .appxsym, including at minimum:
    • AetherSDR.pdb
    • deployed Qt module PDBs such as Core, GUI, Widgets, Network, Multimedia, SerialPort, WebSockets, and SVG
    • deployed Qt plug-in PDBs, especially the Windows QPA plug-in (qwindows.dll)
    • PDBs for locally built DLLs such as qtkeychain
  • Include exact third-party PDBs where the upstream/built artifact provides them.
  • Keep PDBs out of the runtime MSIX; they belong in the Store upload's .appxsym.
  • Preserve the standalone symbol artifact for local WinDbg analysis.

CI validation

Add a hard pre-submission check that:

  1. Enumerates the EXE/DLL files in the staged MSIX payload.
  2. Finds matching PDBs by embedded GUID and age rather than filename alone.
  3. Fails if an AetherSDR-built binary lacks a matching PDB.
  4. Reports third-party binaries for which matching symbols are unavailable.
  5. Verifies that the final .appxsym contains every collected PDB.
  6. Verifies the .msixupload contains both the MSIX and symbol archive.

symchk, DUMPBIN /PDBPATH:VERBOSE, or equivalent LLVM tooling can provide the identity checks.

Acceptance criteria

  • A Store submission contains matching symbols for AetherSDR, deployed Qt modules, Qt plug-ins, and locally built DLLs.
  • CI demonstrates that packaged binary/PDB identities match.
  • A controlled failure in an AetherSDR frame resolves to an AetherSDR function.
  • A controlled failure routed through a Qt frame resolves to a Qt function rather than Qt6*.dll!unknown or qwindows.dll!unknown.
  • Partner Center no longer reports !unknown solely because symbols for a packaged binary were omitted.
  • Documentation explains which dependencies remain unsymbolized and why.

Notes

Symbols will not make every hang actionable: reports containing only OS wait frames, incomplete dumps, or driver-only frames can still lack useful detail. This issue targets the symbol omissions we control.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by tracing the current New-AppxSym implementation and how build/AetherSDR.pdb is placed into the .appxsym and .msixupload artifacts. Use symchk, DUMPBIN /PDBPATH:VERBOSE, or equivalent tooling to compare staged MSIX binaries with collected PDB identities. Done means the archive includes matching available symbols, CI validates both artifacts, and documentation records unavailable third-party symbols.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp
Domain
build-system, ci-cd, devops, release
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.