Newer
Older
TelosDB / journals / 20260215-0004-Troubleshooting_0xc0000139.md

トラブルシューティング: 0xc0000139 STATUS_ENTRYPOINT_NOT_FOUND

概要

Tauri アプリケーションの起動時に 0xc0000139 エラーが発生し、クラッシュする問題が発生した。 このエラーは「プロシージャエントリポイントが見つからない」ことを示しており、通常は DLL のバージョン不整合や、想定と異なる DLL が読み込まれていることに起因する。

原因分析

1. WebView2Loader.dll のアーキテクチャ不整合

  • 現象: ビルドプロセス (build.rs) が target/ ディレクトリ内をスキャンして WebView2Loader.dll を探す際、誤って x86 版(32bit)の DLL を拾ってしまっていた。
  • 詳細: tauri-build や一部のクレートがビルド時に一時的に生成するディレクトリ構造内で、Rust のターゲットアーキテクチャ(x86_64)とは異なるアーキテクチャのファイルが混在していた。
  • 影響: 64bit アプリケーションが 32bit DLL をロードしようとして、エントリポイントが見つからずにクラッシュした。

2. 環境変数 PATH の汚染と MinGW の競合

  • 現象: tauri dev 実行時に、システム PATH やユーザー PATH に含まれる MinGW (C:\msys64\mingw64\bin 等) の DLL が優先的に読み込まれていた可能性。
  • 詳細: libgcc_s_seh-1.dlllibstdc++-6.dll などの依存関係が、Tauri アプリが想定する MSVC ランタイムではなく、GNU 系のランタイムと競合していた。

3. SQLite ライブラリのリンク不整合

  • 現象: rusqlitebundled 機能を無効化した際、システム上の sqlite3.dll が見つからない、または互換性のないバージョンが参照された。
  • 詳細: Hermetic ビルドを目指して DLL を手動管理しようとしたが、適切な sqlite3.dll を配置できず、実行時にエラーとなった。

解決策: Hermetic Build (完全自己完結ビルド) の確立

1. WebView2Loader.dll の厳格な管理

  • プロジェクトルートの bin/ ディレクトリに、検証済みの正しい x64 版 WebView2Loader.dll を配置。
  • build.rs の「自動スキャンロジック」を廃止し、bin/ から target/debug/ への 明示的なコピー のみに変更。

2. SQLite の Bundled 化

  • Cargo.toml にて rusqlitelibsqlite3-sysfeatures = ["bundled"] を有効化。
  • これにより SQLite をソースから静的にコンパイルし、外部の sqlite3.dll への依存を排除。
  • バージョン不整合や PATH 依存のリスクを根絶。

3. スクリプトの簡素化

  • scripts/prepare-resources.cjs: 複雑な除外ロジックを削除。
  • package.json: dev コマンドを powershell 経由の複雑なラッパーから、シンプルな node scripts/prepare-resources.cjs && tauri dev に戻した。

結果

  • 外部環境(PATH やインストール済みソフト)に依存せず、リポジトリ内のリソースのみで正しくビルド・実行できる状態(Hermetic Build)を達成。
  • 0xc0000139 エラーは解消。
  • 最終確認 (2026/02/15): target ディレクトリを削除した状態からの npm run dev 実行にて、アプリケーションが正常に起動することを確認済み。