Иногда перед программистом во время отладки, а особенно 64-битных
приложений, на ровном месте вырастают непроходимые горы, как например
эти:
(нарисовано в thisissand.com)
Как мы видим, причина отказа запускаться неясна, есть намёк на использование какой-то sxstrace.exe из состава командной строки Windows 7. Учимся ею пользоваться, выполняем в командной строке (из того места, где хотим, чтобы лежал log):
Идём в командную строку, жмём Enter дабы прекратить работу sxstrace, выполняем команду:
Понимаем, что у нас не хватает модуля Microsoft.VC90.DebugOpenMP и тут вспоминаем о незаменимом инструменте Dependency Walker, который помогает выяснить, чего не хватает программе для запуска (какие ссылки на внешние DLL не разрешены). Качаем инструмент, сохраняем его в C:\Windows\System32\ и выполняем из командной строки:
Из этой картины следует, что куда-то пропали отладочные 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\Micr osoft.VC90.DebugMFC
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\amd64\Micr osoft.VC90.DebugOpenMP
и кладём их рядом с нашим .exe.
Далее находим где-то в дебрях наших библиотек MGC_OLH_64.DLL, кладём её рядом с отладочной MGC_OLH_64D.DLL и нашим exe.
Запускаем программу - и всё работает
(нарисовано в 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",ve rsion="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__1fc8b3b9a1e18 e3b\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.D ebugOpenMP.DLL.
INFO: Attempt to probe manifest at C:\Dev-9.1\hyp_bin\windows64\bswtestd\Microsoft.VC90.DebugOpenMP\Microsoft.VC90.D ebugOpenMP.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",ve rsion="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
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\amd64\Micr
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\amd64\Micr
и кладём их рядом с нашим .exe.
Далее находим где-то в дебрях наших библиотек MGC_OLH_64.DLL, кладём её рядом с отладочной MGC_OLH_64D.DLL и нашим exe.
Запускаем программу - и всё работает
No comments:
Post a Comment