Re: Should we work around msvc failing to compile tab-complete.c? - Mailing list pgsql-hackers
From | Andres Freund |
---|---|
Subject | Re: Should we work around msvc failing to compile tab-complete.c? |
Date | |
Msg-id | 20240709225934.746y5fg3kgxkyant@awork3.anarazel.de Whole thread Raw |
In response to | Re: Should we work around msvc failing to compile tab-complete.c? (Tom Lane <tgl@sss.pgh.pa.us>) |
Responses |
Re: Should we work around msvc failing to compile tab-complete.c?
|
List | pgsql-hackers |
Hi, On 2024-07-09 17:44:27 -0400, Tom Lane wrote: > Worst case: the reason no one uses readline under Windows is that it flat > out doesn't work. I've just tried it again, it works after splitting the else-if chain. > One thing that struck me while looking at tab-complete.c just now is > that there are aspects of the readline API that require strings to be > malloc'd by the client (tab-complete.c) and later free'd within > libreadline. I wonder how that will play with Windows' weird rules > about when one DLL's malloc pool will interoperate with another's > (cf PQfreemem). It seems to work fine as long as a debug-readline is paired with a debug-psql or a release-readline is paired with a release-psql. Intentionally cross-matching the two does indeed quickly crash, with stack trace that looks like exactly the issue you describe. This is a release readline in a debug psql, but it shouldn't matter which way round. Just doing "tab": # Child-SP RetAddr Call Site 00 00000017`db5ff430 00007ff9`1fa18182 ntdll!RtlReportCriticalFailure+0x56 01 00000017`db5ff520 00007ff9`1fa1846a ntdll!RtlpHeapHandleError+0x12 02 00000017`db5ff550 00007ff9`1fa1e0f1 ntdll!RtlpHpHeapHandleError+0x7a 03 00000017`db5ff580 00007ff9`1f9b79d2 ntdll!RtlpLogHeapFailure+0x45 04 00000017`db5ff5b0 00007ff9`1f9347b1 ntdll!RtlpFreeHeapInternal+0x822c2 05 00000017`db5ff670 00007ff9`1d7df05b ntdll!RtlFreeHeap+0x51 *** WARNING: Unable to verify checksum for C:\dev\postgres-meson\build-ninja-2022\tmp_install\usr\local\pgsql\bin\readline.dll 06 00000017`db5ff6b0 00007ff8`f7ab637c ucrtbase!_free_base+0x1b 07 (Inline Function) --------`-------- readline!_rl_free_match_list+0x19 [C:\dev\vcpkg\buildtrees\readline-win32\src\e6f798e014-dba5d3560f.clean\complete.c@ 1627] 08 00000017`db5ff6e0 00007ff8`f7ab12fc readline!rl_complete_internal+0x4dc [C:\dev\vcpkg\buildtrees\readline-win32\src\e6f798e014-dba5d3560f.clean\complete.c@ 1755] 09 00000017`db5ff750 00007ff8`f7ab1725 readline!_rl_dispatch_subseq+0x2dc [C:\dev\vcpkg\buildtrees\readline-win32\src\e6f798e014-dba5d3560f.clean\readline.c@ 582] 0a (Inline Function) --------`-------- readline!_rl_dispatch+0x18 [C:\dev\vcpkg\buildtrees\readline-win32\src\e6f798e014-dba5d3560f.clean\readline.c@ 530] 0b 00000017`db5ff7a0 00007ff8`f7ab1625 readline!readline_internal_char+0xd5 [C:\dev\vcpkg\buildtrees\readline-win32\src\e6f798e014-dba5d3560f.clean\readline.c@ 449] 0c (Inline Function) --------`-------- readline!readline_internal_charloop+0x13 [C:\dev\vcpkg\buildtrees\readline-win32\src\e6f798e014-dba5d3560f.clean\readline.c@ 490] 0d (Inline Function) --------`-------- readline!readline_internal+0x18 [C:\dev\vcpkg\buildtrees\readline-win32\src\e6f798e014-dba5d3560f.clean\readline.c@ 504] 0e 00000017`db5ff7e0 00007ff7`6f1e9dba readline!readline+0xb5 [C:\dev\vcpkg\buildtrees\readline-win32\src\e6f798e014-dba5d3560f.clean\readline.c@ 300] 0f 00000017`db5ff810 00007ff7`6f1eb211 psql!gets_interactive+0x3a [C:\dev\postgres-meson\src\bin\psql\input.c @ 91] 10 00000017`db5ff850 00007ff7`6f1ee7ec psql!MainLoop+0x3a1 [C:\dev\postgres-meson\src\bin\psql\mainloop.c @ 166] 11 00000017`db5ff980 00007ff7`6f287a99 psql!main+0xcfc [C:\dev\postgres-meson\src\bin\psql\startup.c @ 462] 12 00000017`db5ffaa0 00007ff7`6f2879e2 psql!invoke_main+0x39 [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl@ 79] 13 00000017`db5ffaf0 00007ff7`6f28789e psql!__scrt_common_main_seh+0x132 [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl@ 288] 14 00000017`db5ffb60 00007ff7`6f287b0e psql!__scrt_common_main+0xe [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl@ 331] 15 00000017`db5ffb90 00007ff9`1e9a7374 psql!mainCRTStartup+0xe [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_main.cpp@ 17] 16 00000017`db5ffbc0 00007ff9`1f95cc91 KERNEL32!BaseThreadInitThunk+0x14 17 00000017`db5ffbf0 00000000`00000000 ntdll!RtlUserThreadStart+0x21 executing a statement (crashes after execution): # Child-SP RetAddr Call Site 00 000000db`ae3ff898 00007ff9`1f9cd088 ntdll!RtlpBreakPointHeap+0x16 01 000000db`ae3ff8a0 00007ff9`1f96f6f5 ntdll!RtlpValidateHeapEntry+0x5d858 02 000000db`ae3ff8e0 00007ff9`1d2b6edb ntdll!RtlValidateHeap+0x95 03 000000db`ae3ff930 00007ff8`ba38dc52 KERNELBASE!HeapValidate+0xb 04 000000db`ae3ff960 00007ff8`ba390a76 ucrtbased!_CrtIsValidHeapPointer+0x42 [minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp@ 1407] 05 000000db`ae3ff9a0 00007ff8`ba38f565 ucrtbased!free_dbg_nolock+0x136 [minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp@ 904] 06 000000db`ae3ffaa0 00007ff8`ba392118 ucrtbased!_free_dbg+0x55 [minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp @1030] 07 000000db`ae3ffae0 00007ff7`6f1ebd00 ucrtbased!free+0x28 [minkernel\crts\ucrt\src\appcrt\heap\free.cpp @ 39] 08 000000db`ae3ffb20 00007ff7`6f1ee7ec psql!MainLoop+0xe90 [C:\dev\postgres-meson\src\bin\psql\mainloop.c @ 579] 09 000000db`ae3ffc50 00007ff7`6f287a99 psql!main+0xcfc [C:\dev\postgres-meson\src\bin\psql\startup.c @ 462] 0a 000000db`ae3ffd70 00007ff7`6f2879e2 psql!invoke_main+0x39 [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl@ 79] 0b 000000db`ae3ffdc0 00007ff7`6f28789e psql!__scrt_common_main_seh+0x132 [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl@ 288] 0c 000000db`ae3ffe30 00007ff7`6f287b0e psql!__scrt_common_main+0xe [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl@ 331] 0d 000000db`ae3ffe60 00007ff9`1e9a7374 psql!mainCRTStartup+0xe [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_main.cpp@ 17] 0e 000000db`ae3ffe90 00007ff9`1f95cc91 KERNEL32!BaseThreadInitThunk+0x14 0f 000000db`ae3ffec0 00000000`00000000 ntdll!RtlUserThreadStart+0x21 Note that the line numbers seem to commonly point to where the next frame would return to (i.e. mainloop.c:579 is the call to free, but on return the if (slashCmdStatus == PSQL_CMD_TERMINATE) would be reached, so that's displayed - why I don't know). Greetings, Andres Freund
pgsql-hackers by date: