問題描述
在安裝 postgreSQL12.21.1 時,initdb.exe 無法正常啟動,報錯資訊為應用程式無法啟動,錯誤程式碼 0xc0000022。
問題排查過程
- 初始排查與嘗試
- 由於個人計算機存在早期許可權劃分遺留問題,此前多個程式(如 PS、Balatro、MySQL 等)出現類似報錯,通常以管理員身份開啟可解決,但此次 initdb.exe 無效。
- 第一次檢查
- 檢查同時安裝的其他檔案,如 clusterdb.exe、createdb.exe 等,發現這些檔案在無管理員身份時出現 0xc0000022 報錯,以管理員身份開啟則無報錯。
- 透過網路排查,找到相關部落格(https://blog.csdn.net/u011639103/article/details/128961263),雖不確定 “0xc 開頭為 C 語言錯誤” 的準確性,但推測問題屬於動態連結庫異常。
- 第二次嘗試
- 根據 copilot 建議,使用 Dependencies Walker 和 Depnedencies 確定 initdb.exe 在哪些 DLL 上有問題。
- 掃描出部分異常 DLL,根據報錯下載放置在 “Windows\SysWOW64” 中,但未解決問題,且用這兩個軟體掃描已知正常的.exe 檔案也有類似錯誤提示。
- 第三次排查與解決
- 在其他裝置正常安裝 pgsql 後,確定問題僅出在個人裝置上,從環境角度排查。 下載 DirectX Repair 增強版修復 C++ 庫,過程包括兩步,因此無法確定是哪一步解決了問題:
- 先刪除多次修復仍報錯的 VC redist 2015 - 2022 庫(x64 和 x86)並重啟,然後使用 DirectX Repair 下載較低版本的 2015 - 2022 庫。
- 在 DirectX Repair 選項中註冊所有 DLL 並重啟。
問題解決結果
重啟後,initdb.exe 成功啟動。
總結與思考
0xc0000022 問題多數因動態連結庫異常導致,可能是 DLL 檔案許可權問題,使許可權低的軟體無法訪問,表現為部分程式以管理員身份執行可解決。
此次情況特殊,若讀者遇到管理員身份開啟仍無法解決的類似問題,希望本查錯過程能提供幫助。對於此次解決問題的具體有效步驟,更傾向於 DLL 註冊,但不能確定放置在 SysWOW64 中的新 DLL 是否在註冊後起到了作用。因此如果有人不幸遇到了類似問題,且註冊 DLL 未解決時,可以考慮是否是這個變數影響了結果。以下是我下載的三個 DLL 。
如果有讀者可以明確是哪種方式解決了這個問題,歡迎交流,餘將不勝感激。