From a60a5821352f59ba2ba31330610811eb61e9efe5 Mon Sep 17 00:00:00 2001
From: Nazir Bilal Yavuz <byavuz81@gmail.com>
Date: Tue, 9 Jun 2026 16:15:30 +0300
Subject: [PATCH v1] 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 composite action.

[1] https://github.com/anarazel/pg-vm-images/blob/main/scripts/windows_install_dbg.ps1

Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
Discussion:
---
 .../actions/windows-setup-debugger/action.yml | 82 +++++++++++++++++++
 .github/workflows/pg-ci.yml                   | 12 +--
 2 files changed, 88 insertions(+), 6 deletions(-)
 create mode 100644 .github/actions/windows-setup-debugger/action.yml

diff --git a/.github/actions/windows-setup-debugger/action.yml b/.github/actions/windows-setup-debugger/action.yml
new file mode 100644
index 00000000000..e6e5192db39
--- /dev/null
+++ 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
+
+        # 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
diff --git a/.github/workflows/pg-ci.yml b/.github/workflows/pg-ci.yml
index 5bc5292d2a5..7331b261166 100644
--- a/.github/workflows/pg-ci.yml
+++ b/.github/workflows/pg-ci.yml
@@ -990,6 +990,9 @@ jobs:
         shell: cmd
         run: mkdir ${{env.PG_REGRESS_SOCK_DIR}}
 
+      - name: Setup Windows debugger
+        uses: ./.github/actions/windows-setup-debugger
+
       - name: Configure
         run: |
           call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64
@@ -1019,9 +1022,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 +1116,9 @@ jobs:
         shell: cmd
         run: mkdir ${{env.PG_REGRESS_SOCK_DIR}}
 
+      - name: Setup Windows debugger
+        uses: ./.github/actions/windows-setup-debugger
+
       - *ccache_restore_default_step
       - *ccache_restore_branch_step
 
@@ -1138,9 +1141,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
 
 
-- 
2.47.3

