пятница, 15 марта 2013 г.

Танцы с бубнами Visual C/C++ (Visual Studio 2008 Express): Error C2471: cannot update program database

При написании предыдущей статьи мне пришлось столкнуться с проблемой

Error C2471: cannot update program database


 Данная проблема возникла IMHO из-за того что я снес Visual Studio 2008 Express и водрузил Visual Studio 2008 SP1 Express. (Также грешу на то, что я накатил Windows SDK для компиляции x64).

Но суть не в том, что привело к этой  проблеме,  а как ее решить.
Проблема известна Мелкософту (http://support.microsoft.com/kb/946040), но адекватного решения я не нашел -- патч не желает накатываться на Visual Studio 2008 Express -- мотивируя тем что "None of the products that are addressed by this software update are installed on this computer. Click Cancel to exit setup." А что ему хочется фиксить, я так и не понял. Кстати, по отзвукам от пользователей этот патч не смог побороть проблемы в Visual Studio C/C++ 2008, а иногда такая проблема возникает и у Visual Studio C/C++ 2005.
Неужто нас так заставляют переползать на Visual Studio 2010 - Visual Studio 2012?

Из описания следует, что проблема в Mspdbcore.dll и фикс должен установить файлы версии 9.0.21022.37 с размером 288256 для x32 или 396800 для x64.

У меня же стоит версия Mspdbcore.dll 9.0.30729.1 с размером 288768 x32.
Т.е. Мелкософт целеноправельно предлагает откатиться на более старую версию.

Распаковать VS90-KB946040.exe мне с первого захода удалось до VS90-KB946040.msp, где храняться нужные мне файлы, до дальше распаковать не получилось :(...

Пришлось искать на просторах интернета другой Mspdbcore.dll.

Нашел Mspdbcore.dll 8.0.50727.42 (http://yadi.sk/d/U83nD7nS3IjnK) подложил его в "C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\" предварительно сделал резервную копию.
И вуаля :-) Компиляция прошла без проблем :-))))

Но меня все же жаба душила, что эта версия Mspdbcore.dll от Visual C/C++ 2005 и она явна не рекомендована для Visual C/C++ 2008 -- пришлось все же распатронить прааааативный msp.

Наткнулся на забавную статью http://qwers.com/Poleznie-soveti-dlja-Windows7/Interfeis/intvza19.htm
Но самого файла MSI Extractor там не оказалось :(((
Пришлось продолжнить поиски и скачать и установить наверно штук 20 различных утилит, которые были либо абсолютно бесполезными либо были троянцами :((
В результате я наткнулся на
http://superuser.com/questions/307678/how-to-extract-files-from-msi-package
http://blogs.msdn.com/b/heaths/archive/2006/04/07/571138.aspx
и наконец на 
https://skydrive.live.com/?cid=9415f61cbb1a8030&id=9415F61CBB1A8030!6614
(ссылки привожу в знак уважения к авторам)

В результате мне удалось скачать MsiX (http://yadi.sk/d/18bE_K_G3Inz0)
и с грехом пополам распаковать ненавистный VS90-KB946040.msp
В результате я получил два файла (после рекурсивной распаковки парочкой различных утилит, анализа файлов и переименования в удобопонятный вид)
21.12.2007  05:35           288 256 mspdbcore.dll
21.12.2007  05:41           396 800 mspdbcore.dll
Файлы выложил сюда (http://yadi.sk/d/sYWvIBgc3InzK)

Далее файл mspdbcore.dll я положил  "C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\" и пошел проверять компиляцию...
ВАШУ МАШУ!!! %\
%&^%&^%*&%^#@&*%^$^%^@#%$^#%@*&%$@#&$^!!!
Мало того что вернулась проблема
f:\...\proc.c(11) : error C2471: cannot update program database 'f:\...\debug\vc90.idb'
так еще появилась новая:
f:\...\signals.c : fatal error C1090: PDB API call failed, error code '23' : '(

Срочно меняю mspdbcore.dll обратно на 8.0.50727.42
%^&%&*%^*&^%&^
C1090 пропала, но C2471 осталась :(((
При этом файл vc90.idb и mspdbcore.dll лочатся до перезагрузки системы  :((( Вывод: mspdbcore.dll падает :(((
Меняю на 9.0.30729.1 => C2471, но файлы vc90.idb и mspdbcore.dll не лочатся :(((

Меняю на 9.0.21022.37 => C2471 и C1090, но файлы vc90.idb и mspdbcore.dll не лочатся :(((
Меняю на 8.0.50727.42 => свежая C1033
f:\...\signals.c : fatal error C1033: cannot open program database 'f:\...\debug\vc90.idb'

f:\...\thread.c : fatal error C1033: cannot open program database 'f:\...\debug\vc90.idb'
o:\...\applink.c : fatal error C1033: cannot open program database 'f:\...\debug\vc90.idb'
т.к. пол проекта было скомпилировано без ошибок, то вывод mspdbcore.dll падает после полусотни исходников, лочит vc90.idb, лочится сам и после этого компиляция невозможна :(((

Как возможное решение для ленивых, заменить параметр создания дебаг информации (Project\Properties\Configuration Properties\C/C++\General\Debug information format: /ZI на /Zi в режиме Debug (а режиме Release он и так стоит)), но мы то простых путей не ищем %)

[to be continued]


Да кстати, маленький совет -- после замены DLL перезагружайте систему и удаляйте все в директория Debug и Release, а также "ненужные" самосозданные файлы.

Выводы:
1) ЛУЧШЕЕ ВРАГ ХОРОШЕГО!!!
2) Я уже не уверен, что (ну почти) коммерческий Visual Studio менее глюкав, чем абсолютно бесплатный MinGW
3) Если все работает, то ничего не трогай (с) бородатый анекдот про программиста и его сына









Комментариев нет:

Отправить комментарий