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

20260215-0004 トラブルシューティングの結末:DLL競合の解消と明示的ビルドの確立

1. 発生した問題 (What happened)

Tauri アプリケーションのビルド後の起動時に、以下のエラーが発生し、プログラムが即座に終了する現象が発生した。

  • エラーコード: 0xc0000139 (STATUS_ENTRYPOINT_NOT_FOUND)
  • 現象: 実行ファイルを実行しても GUI も表示されず、エントリポイントが見つからないというシステムエラーダイアログが表示される。

2. 原因の特定 (What was the cause)

広範な調査の結果、以下の要因による ABI (Application Binary Interface) 衝突 であることが判明した。

真因:システム環境変数 PATH の汚染と、ビルド時のアーキテクチャ誤認

Windows の DLL ロード順序において、アプリケーション自身のディレクトリに DLL が見つからない場合、システムは PATH を探索する。

  • ユーザー環境の PATH の先頭付近に MinGW (GNU) ベースのツールチェーンが含まれていた(具体的には text-generation-webui の環境)。
  • アプリケーションは MSVC でビルドされていたが、実行時に WebView2Loader.dllsqlite3.dll を探す際、PATH にある MinGW 版を誤ってロードしてしまった。
  • 同名でも内部構造やエクスポート関数が異なるため、「エントリポイント未発見」でクラッシュしていた。

  • システム PATH 内の予期せぬ競合:

    • 調査の結果、C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\ に存在する WebView2Loader.dll がロードされていたことが判明した。
    • これは MinGW 版と同様に、MSVC ビルドが期待するエントリポイントを持っていない(あるいは architecture が不一致)ため、0xc0000139 クラッシュを引き起こしていた。
  • ビルドプロセスでのアーキテクチャ誤認:

    • また、初期の集約スクリプトにおいて、target/debug/build 内の x86WebView2Loader.dll を優先して拾ってしまい、バイナリ(x64)の隣に不適切な DLL を置いていたことも二次的な要因となっていた。

3. 解決策 (How it was solved)

環境変数 PATH の手動クリーンアップに頼らず、ビルドプロセス自体を「自己完結型(Hermetic)」にすることで、根本的に問題を解決した。

実装した解決策

  1. DLL 自動集約ロジック (build.rs)

    • ビルド時に target ディレクトリ全体をスキャンし、MSVC ビルド環境が生成した正しい WebView2Loader.dll を自動的に発見。
    • 発見した DLL を .exe と同じディレクトリに物理的にコピーする。これにより、OS 起動時に PATH を見に行く前に、隣にある正しい DLL を確実に読み込ませる。
  2. SQLite のスタティックリンク強制

    • Cargo.tomlrusqlitelibsqlite3-sysbundled フィーチャーを有効化。
    • SQLite エンジンをバイナリ内に静的に埋め込むことで、外部の sqlite3.dll への依存を完全に排除。
  3. リソース準備スクリプトの最適化

    • prepare-resources.cjs から不要な sqlite3.dll の混入を防止するガードを追加。

4. 構成の概要図

sequenceDiagram
    participant OS as Windows OS Loader
    participant Exe as telos-db.exe
    participant Local as App Directory (.dll)
    participant Path as System PATH (MinGW)

    rect rgb(200, 255, 200)
    Note over OS, Local: 現在の解決策 (明示的)
    OS->>Exe: 起動開始
    OS->>Local: 隣にある DLL を確認
    Local-->>OS: MSVC版 DLL を提供 (Match!)
    OS->>Exe: 正常起動
    end

    rect rgb(255, 200, 200)
    Note over OS, Path: 以前の失敗 (環境依存)
    OS->>Exe: 起動開始
    OS->>Local: 隣に DLL がない
    OS->>Path: PATH を探索
    Path-->>OS: MinGW版 DLL を提供 (ABI Conflict!)
    OS->>Exe: 0xc0000139 クラッシュ
    end

結論

本対応により、開発環境の PATH 設定がどのような状態であっても、一貫して正しく動作する「自己完結型」の堅牢なアプリケーション基盤が確立された。