Thursday, June 20, 2013

Непроходимые горы, Dependency Walker, sxstrace.exe и другие

Иногда перед программистом во время отладки, а особенно 64-битных приложений, на ровном месте вырастают непроходимые горы, как например эти:


(нарисовано в thisissand.com)

"...И горы встают перед ним на пути,
И он по горам начинает ползти,
А горы всё выше, а горы всё круче,
А горы уходят под самые тучи!...

И сейчас же с высокой скалы к Айболиту спустились орлы..." (с)
 
С некоторым трудом скомпилировал 64-битное приложение под Debug-ом, а оно во время запуска ругается:

Как мы видим, причина отказа запускаться неясна, есть намёк на использование какой-то sxstrace.exe из состава командной строки Windows 7. Учимся ею пользоваться, выполняем в командной строке (из того места, где хотим, чтобы лежал log):
sxstrace.exe Trace -logfile:myfile.exe.etl
Запускаем отдельно нашу программу, которая снова выдаёт вышеобозначенное сообщение.
Идём в командную строку, жмём Enter дабы прекратить работу sxstrace, выполняем команду:
sxstrace.exe Parse -logfile:myfile.exe.etl -outfile:myfile.exe.txt
Читаем полученный файл myfile.exe.txt:
INFO: Resolving reference Microsoft.VC90.DebugOpenMP,processorArchitecture="amd64",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8".
    INFO: Resolving reference for ProcessorArchitecture amd64.
        INFO: Resolving reference for culture Neutral.
            INFO: Applying Binding Policy.
                INFO: No publisher policy found.
                INFO: No binding policy redirect found.
            INFO: Begin assembly probing.
                INFO: Did not find the assembly in WinSxS.
                INFO: Attempt to probe manifest at C:\windows\assembly\GAC_64\Microsoft.VC90.DebugOpenMP\9.0.21022.8__1fc8b3b9a1e18e3b\Microsoft.VC90.DebugOpenMP.DLL.
                INFO: Attempt to probe manifest at C:\Dev-9.1\hyp_bin\windows64\bswtestd\Microsoft.VC90.DebugOpenMP.DLL.
                INFO: Attempt to probe manifest at C:\Dev-9.1\hyp_bin\windows64\bswtestd\Microsoft.VC90.DebugOpenMP.MANIFEST.
                INFO: Attempt to probe manifest at C:\Dev-9.1\hyp_bin\windows64\bswtestd\Microsoft.VC90.DebugOpenMP\Microsoft.VC90.DebugOpenMP.DLL.
                INFO: Attempt to probe manifest at C:\Dev-9.1\hyp_bin\windows64\bswtestd\Microsoft.VC90.DebugOpenMP\Microsoft.VC90.DebugOpenMP.MANIFEST.
                INFO: Did not find manifest for culture Neutral.
            INFO: End assembly probing.
 ERROR: Cannot resolve reference Microsoft.VC90.DebugOpenMP,processorArchitecture="amd64",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8".ERROR: Activation Context generation failed.

Понимаем, что у нас не хватает модуля Microsoft.VC90.DebugOpenMP и тут вспоминаем о незаменимом инструменте Dependency Walker, который помогает выяснить, чего не хватает программе для запуска (какие ссылки на внешние DLL не разрешены). Качаем инструмент, сохраняем его в C:\Windows\System32\ и выполняем из командной строки:
depends bsw.exe
и получаем красочную картину мира:

 Из этой картины следует, что куда-то пропали отладочные MFC90D.DLL, MSVCP90D.DLL, MSVCR90D.DLL, а также одна из наших библиотек MGC_OLH_64.DLL причём Release-ная версия.

Решение
Теперь самое главное - плюём на правильное решение проблемы, просто копируем все DLL из
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\amd64\Micr
osoft.VC90.DebugCRT
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\amd64\Microsoft.VC90.DebugMFC
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\amd64\Microsoft.VC90.DebugOpenMP
и кладём их рядом с нашим .exe.
Далее находим где-то в дебрях наших библиотек MGC_OLH_64.DLL, кладём её рядом с отладочной MGC_OLH_64D.DLL и нашим exe.
Запускаем программу - и всё работает

No comments:

Post a Comment