必要なdllが足りてない例外でアプリが落ちてるときの調べ方(案)

もくじ
https://tera1707.com/entry/2022/02/06/144447

やりたいこと

開発PCではご機嫌にうごいていたアプリ(exe)が、クリーンインストールしたwindowsのような、きれいな環境にもっていくと、とたんに動かなくなることがある。

で、イベントビューアを見ると、「ファイルがなかった」的エラーが起きている。

でも、なんのファイル(たぶんdll)が足りないのかはエラーMsgには書いてくれない。

同種のエラーがあったときに、なんのファイルが足りないのかを調べたい。

調べ方案

ファイルが足りないエラーが起きたことを知る(VSの入ってない対象PCで実施)

イベントビューアを見て、下記のようなエラーがおきていることを知る。
(必要なdllが足りてない例外でアプリが落ちてる、というのをここで知る)

※イベントビューアのログを張る。
たしか、「File NotFound Exception」的な奴だったと思う

dumpbinで依存ファイルを調べる(VSの入ってる開発PCで実施)

dumpbin.exeが入っている、VisualStudioが入ったPCを用意する。

そのPCに、落ちたアプリのexeが含まれているフォルダをまるっと持っていく。

そのフォルダで、「開発者コマンドプロンプト」を開く。普通のcmdで、下記をやるか、スタートメニューのVisualStudio2022から開ける。

call "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\Tools\VsDevCmd.bat"

そこで、下記のようにして、dumpbinを実行する。

cd <対象のexeがあるフォルダ>
dumpbin.exe /dependents <対象のexe>

下記のような感じで、依存ファイルの一覧が出てくる。
(WindowsProject4.exeというexeの依存ファイルを調べた例。)

Dump of file WindowsProject4.exe

File Type: EXECUTABLE IMAGE

  Image has the following dependencies:

    USER32.dll
    VCRUNTIME140D.dll
    ucrtbased.dll
    KERNEL32.dll

  Summary

        1000 .00cfg
        1000 .data
        2000 .idata
        1000 .msvcjmc
        3000 .pdata
        3000 .rdata
        1000 .reloc
       1C000 .rsrc
        9000 .text
       10000 .textbss

USER32.dllからKERNEL32.dllまでの4ファイルが依存ファイル。

これで、依存するファイルがわかった。

whereでそのファイルがあるかを調べる(VSの入ってない対象PCで実施)

前項で調べた、依存ファイルをメモっておき、下記のコマンドを実行する。

where <依存ファイル.dll>

例えば、「user32.dll」に対してwhereをすると、

C:\Users\masa\source\repos\HyperDumpBin\HyperDumpBin\bin\x64\Debug\net8.0>where user32.dll
C:\Windows\System32\user32.dll

という感じになり、C:\Windows\System32\に、user32.dllがあることがわかる。

※まだ未確認なのだが、

存在しないファイルの場合、これが一つも出てこないと思われる。

おわり

  • 開発PCでdumpbin
  • 対象PCでwhere

で、なんのファイルが足りていないか、わかりそう。(要裏取り)

参考

https://atmarkit.itmedia.co.jp/ait/articles/0904/10/news115.html