From a60a5821352f59ba2ba31330610811eb61e9efe5 Mon Sep 17 00:00:00 2001 From: Nazir Bilal Yavuz 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 "\crashlogs\crashlog-.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 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 + \crashlogs\crashlog-.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