もくじ
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