Hi, Thank you for looking into this!
On Wed, 10 Jun 2026 at 16:49, Andres Freund <[email protected]> wrote: > > On 2026-06-10 15:59:20 +0300, Nazir Bilal Yavuz wrote: > > +++ b/.github/actions/windows-setup-debugger/action.yml > > @@ -0,0 +1,82 @@ > > +name: Setup Windows debugger > > +description: >- > > + Setup Windows debugger to log all crashes to > > + <workspace>\crashlogs\crashlog-<pid-in-hex>.txt > > + > > +runs: > > + using: composite > > + steps: > > + - name: Setup Windows debugger > > + shell: pwsh > > + run: | > > + $crashdir = "${{ github.workspace }}/crashlogs" > > + New-Item -ItemType Directory -Force -Path $crashdir > > Any reason to not just put this into src/tools/ci/<something>.ps1? Given that > we're just talking about a single step, I don't really see the benefit of a > composite action here. Not any particular reason. I started implementing that in a pg-ci.yml, then moved it to composite action when I realized it was too long. I think having a script is better, so attached v2 uses that way. -- Regards, Nazir Bilal Yavuz Microsoft
From 5655e2550c1c040955f6b33f28fd3736decffd0f Mon Sep 17 00:00:00 2001 From: Nazir Bilal Yavuz <[email protected]> Date: Tue, 9 Jun 2026 16:15:30 +0300 Subject: [PATCH v2] ci: Generate crashlogs on Windows cdb.exe is configured to log all crashes to "<workspace>\crashlogs\crashlog-<pid-in-hex>.txt". Upload logs step already configured to collect these logs, so no change is needed on there. Logic is copied from where Postgres CI Windows images are generated [1]. Since this step is too long, it is implemented as 'src/tools/ci/gha_setup_windows_debugger.ps1' script. [1] https://github.com/anarazel/pg-vm-images/blob/main/scripts/windows_install_dbg.ps1 Author: Nazir Bilal Yavuz <[email protected]> Discussion: https://postgr.es/m/CAN55FZ1BgsXSTzOpehnMa4NzWL8Aivsxx-di7-VT6bZ3j2Omow%40mail.gmail.com --- .github/workflows/pg-ci.yml | 13 ++-- src/tools/ci/gha_setup_windows_debugger.ps1 | 75 +++++++++++++++++++++ 2 files changed, 82 insertions(+), 6 deletions(-) create mode 100644 src/tools/ci/gha_setup_windows_debugger.ps1 diff --git a/.github/workflows/pg-ci.yml b/.github/workflows/pg-ci.yml index 5bc5292d2a5..742a8431782 100644 --- a/.github/workflows/pg-ci.yml +++ b/.github/workflows/pg-ci.yml @@ -990,6 +990,11 @@ jobs: shell: cmd run: mkdir ${{env.PG_REGRESS_SOCK_DIR}} + - &windows_setup_debugger_step + name: Setup Windows debugger + shell: pwsh + run: src/tools/ci/gha_setup_windows_debugger.ps1 + - name: Configure run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 @@ -1019,9 +1024,6 @@ jobs: call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 run: *meson_test_world_cmd - # TODO: We need to collect crashlogs but for them to be generated, we'd - # have to configure the JIT Debugger to do so. cdb.exe is installed on - # the runner so that is possible. - *upload_logs_step @@ -1116,6 +1118,8 @@ jobs: shell: cmd run: mkdir ${{env.PG_REGRESS_SOCK_DIR}} + - *windows_setup_debugger_step + - *ccache_restore_default_step - *ccache_restore_branch_step @@ -1138,9 +1142,6 @@ jobs: - name: Test world run: *meson_test_world_cmd - # TODO: We want to include crashlogs, but they are not yet - # collected. cdb.exe is installed on the runner, so we can configure it - # appropriately. - *upload_logs_step diff --git a/src/tools/ci/gha_setup_windows_debugger.ps1 b/src/tools/ci/gha_setup_windows_debugger.ps1 new file mode 100644 index 00000000000..babfbe76278 --- /dev/null +++ b/src/tools/ci/gha_setup_windows_debugger.ps1 @@ -0,0 +1,75 @@ +# Setup Windows debugger to log all crashes to +# <workspace>\crashlogs\crashlog-<pid-in-hex>.txt + +$ErrorActionPreference = 'Stop' + +$crashdir = "$env:GITHUB_WORKSPACE/crashlogs" +New-Item -ItemType Directory -Force -Path $crashdir + +# Ensure restricted child processes can write the log file +icacls $crashdir /grant "${env:USERNAME}:(OI)(CI)F" /Q + +# Prevent windows error handling dialog from causing hangs +New-ItemProperty -Force -Path 'HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting' ` + -Name 'DontShowUI' -Value 1 -PropertyType DWord +New-ItemProperty -Force -Path 'HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting' ` + -Name 'Disabled' -Value 1 -PropertyType DWord + +### Fallback minidumps if the JIT debugger below doesn't run +New-Item -Force -Path 'HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting' ` + -Name 'LocalDumps' +New-ItemProperty -Force -Path 'HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps' ` + -Name 'DumpFolder' -Value $crashdir -PropertyType ExpandString +New-ItemProperty -Force -Path 'HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps' ` + -Name 'DumpCount' -Value 5 -PropertyType DWord +New-ItemProperty -Force -Path 'HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps' ` + -Name 'DumpType' -Value 1 -PropertyType DWord +### + +$cdb64 = @( + 'C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe', + 'C:\Program Files\Windows Kits\10\Debuggers\x64\cdb.exe' + ) | Where-Object { Test-Path $_ } | Select-Object -First 1 +$cdb86 = $cdb64.Replace('\x64\', '\x86\') + +### +# -p PID: +# Specifies the decimal process ID to be debugged. This is used to debug a +# process that is already running. +# -e Event: +# Signals the debugger that the specified event has occurred. This option is +# only used when starting the debugger programmatically. +# -g: +# Ignores the initial breakpoint in target application. This option will +# cause the target application to continue running after it is started or +# CDB attaches to it, unless another breakpoint has been set. +# -kqm: +# Starts CDB/NTSD in quiet mode. +# -c "command": +# Specifies the initial debugger command to run at start-up. This command +# must be surrounded with quotation marks. Multiple commands can be +# separated with semicolons. +### +$debuggerArgs = ' -p %ld -e %ld -g -kqm -c ".lines -e; .symfix+ ; aS /x proc $tpid ; .block {.logappend ' + "$crashdir/crashlog-" + '${proc}.txt} ; lsa $ip ; ~*kP ; !peb ; .logclose ; q "' + +Write-Host "Using cdb (x64): $cdb64" +Set-ItemProperty ` + -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug' ` + -Name 'Debugger' -Value ('"' + $cdb64 + '"' + $debuggerArgs) +New-ItemProperty -Force -PropertyType DWord -Value 1 ` + -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug' ` + -Name 'Auto' + +Write-Host "Using cdb (x86): $cdb86" +Set-ItemProperty ` + -Path 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug' ` + -Name 'Debugger' -Value ('"' + $cdb86 + '"' + $debuggerArgs) +New-ItemProperty -Force -PropertyType DWord -Value 1 ` + -Path 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug' ` + -Name 'Auto' + +# Show registered AeDebug values for diagnostics +Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug' | + Format-List Debugger,Auto +Get-ItemProperty 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug' | + Format-List Debugger,Auto -- 2.47.3
