Github Action MinGW 0xc0000139 除錯

前一陣子 Github Action 提供的 windows runner 更新了 MinGW 至 11.2.0,但我們的 CI 也因此跳出 0xc0000139 的錯誤碼,那原因是因為路徑沒有設定好,所需的相關 DLL 檔雖然原先是從別的套件所來,他們兩者是一樣的,所以並沒有因此跳出錯誤;然而 MinGW 更新後,兩者就不一樣了,導致出現錯誤。那從表現上來看,當跳出這兩種錯誤的意思分別為

  • 0xc0000139: 有找到相關同檔名的 DLL 但並不符合版本
  • 0xc0000135: 找不到相關同檔名的 DLL

以下就分享我如何處理這些的流程

ldd in Windows

有在用 Linux 的可能會知道, ldd 是可以幫忙看執行檔執行時連結到哪些 (.so) ,而 Windows 我也是到最近才知道 Git for Windows 有提供 ldd.exe 做一樣的事情,但在 Windows 就是看執行檔執行時連結到哪些 (.dll)

檢查及處理

利用 ldd.exe 去檢查程式所連接到 DLL 檔,發現程式連接到的 libstdc++-6.dll 以及 libgcc_s_seh-1.dll 是連接到 C:\Strawberry\c\bin ,這些跟 MinGW 的版本不一樣所以會導致 0xc0000139 錯誤,將之從環境變數 PATH 移除,會發現他們改用到 C:\Strawberry\c\bin ,所以就在把它去掉後,終於用到 Git 下 mingw64 的了;但又會發生找不到 omp 的問題 (0xc0000135),從 Chocolatey 的這裡中發現會放在 C:\ProgramData\chocolatey\lib\mingw\tools\install\mingw64\bin 之下。

為了方便以及確保我們要使用的 DLL 檔都會最先找到,最後並非把不要用的刪除,而是把 C:\ProgramData\chocolatey\lib\mingw\tools\install\mingw64\bin;C:\Program Files\Git\mingw64\bin; 加在 PATH 前頭,確保使用正確的 DLL 檔,也解決了 0xc000139 以及 0xc000135 的錯誤。