пятница, 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) Если все работает, то ничего не трогай (с) бородатый анекдот про программиста и его сына









четверг, 14 марта 2013 г.

Visual C/C++ x32 vs Visual C/C++ x64 vs MinGW x32

Оказывается у меня появились постоянные подписчики :)

После одного из комментариев  у меня появилась идея протестировать на производительность код, собираемый разными компиляторами под Windows.

Задача: Выяснить, возможно ли без потери производительности использовать ГНУтые компиляторы для высокопроизводительных коммерческих задач под Windows.

Дано:
1) MinGW 4.4.0
2) Visual C/C++ 2008SP1 (из Visual Studio 2008 Express)
3) x64 компилятор из Windows SDK v7.0 (http://en.wikipedia.org/wiki/Microsoft_Windows_SDK, http://www.microsoft.com/en-us/download/details.aspx?id=18950)

---8<---- РЕМАРКА ---8<----
То, как я устанавливал сначала Visual C/C++ 2008SP1 (вместе с SP1) это отдельная песня -- везде лежит Visual C/C++ 2008 Express без SP, и отдельно SP1, который встает только на версии НЕ Express.

Где-то (так и не понял, да и не помню где) раздобыл web инсталлятор
2 728 440 vcsetup.exe
он и содержит Visual C/С++ 2008+SP1
в отличии от
2 701 304 vcsetup.exe
который содержит только Visual C/С++ 2008 без SP1

Далее прыжки с бубнами на накатывании Windows SDK, причем после очередной итерации выползли ошибки при компиляции проектов :(((
---8<---- РЕМАРКА ---8<----

Но это все мелочи -- в результате я скомпилировал один и тот же исходный код Apache Benchmark из полного комплекта Apache 2.2.24 под тремя разными компиляторами 


 136 192 ab_mingw440_win32.exe
  85 504 ab_vs2008_amd64.exe
  72 704 ab_vs2008_win32.exe
При этом IMHO Visual Studio собирал проект раза в 2 быстрее чем QT Creator+MinGW.

А теперь в номера!!! (c)

Тестовый стенд: Ноутбук Acer TimelineX i3-330M RAM 3Gb, Windows7 x64 Home Basic, свап запрещен, канал в интернет 10Mbit, nginx 1.3.33 на 127.0.0.1:80

Win7x64 i3-330M: 60К обращений в 4 трида к localhost@nginx133. Попытка №1
Тест 1 Тест 2 Тест 3 Тест 4 Тест 5 Тест 6 Тест 7 Тест 8 Тест 9 Тест 10 Мин Средн Макс
ab_mingw440_win32.exe 1 379,54 оpеr pеr sеc 1 398,09 оpеr pеr sеc 1 324,43 оpеr pеr sеc 657,12 оpеr pеr sеc 657,91 оpеr pеr sеc 1 402,17 оpеr pеr sеc 923,67 оpеr pеr sеc 616,27 оpеr pеr sеc 658,14 оpеr pеr sеc 1 372,15 оpеr pеr sеc 616,27 -0,21% 1038,949 0,00% 1402,17 -1,06%
ab_vs2008_amd64.exe 1 310,44 оpеr pеr sеc 1 412,47 оpеr pеr sеc 880,73 оpеr pеr sеc 665,88 оpеr pеr sеc 682,79 оpеr pеr sеc 1 417,15 оpеr pеr sеc 668,90 оpеr pеr sеc 617,56 оpеr pеr sеc 667,27 оpеr pеr sеc 1 313,13 оpеr pеr sеc 617,56 0,00% 963,632 -7,25% 1417,15 0,00%
ab_vs2008_win32.exe 1 409,88 оpеr pеr sеc 1 364,85 оpеr pеr sеc 1 399,11 оpеr pеr sеc 616,27 оpеr pеr sеc 667,04 оpеr pеr sеc 1 384,00 оpеr pеr sеc 662,33 оpеr pеr sеc 660,27 оpеr pеr sеc 664,73 оpеr pеr sеc 1 408,85 оpеr pеr sеc 616,27 -0,21% 1023,733 -1,46% 1409,88 -0,51%



Win7x64 i3-330M: 60К обращений в 4 трида к localhost@nginx133. Попытка №2
Тест 1 Тест 2 Тест 3 Тест 4 Тест 5 Тест 6 Тест 7 Тест 8 Тест 9 Тест 10 Мин Средн Макс
ab_mingw440_win32.exe 1 152,21 оpеr pеr sеc 1 233,93 оpеr pеr sеc 1 266,43 оpеr pеr sеc 631,45 оpеr pеr sеc 602,55 оpеr pеr sеc 558,19 оpеr pеr sеc 610,10 оpеr pеr sеc 625,80 оpеr pеr sеc 550,16 оpеr pеr sеc 572,21 оpеr pеr sеc 550,16 -0,27% 780,303 0,00% 1266,43 -2,17%
ab_vs2008_amd64.exe 1 297,18 оpеr pеr sеc 1 260,21 оpеr pеr sеc 559,68 оpеr pеr sеc 551,81 оpеr pеr sеc 621,14 оpеr pеr sеc 576,62 оpеr pеr sеc 611,57 оpеr pеr sеc 602,89 оpеr pеr sеc 605,94 оpеr pеr sеc 559,64 оpеr pеr sеc 551,81 0,00% 724,668 -5,35% 1297,18 0,00%
ab_vs2008_win32.exe 1 242,70 оpеr pеr sеc 1 169,40 оpеr pеr sеc 1 226,06 оpеr pеr sеc 621,24 оpеr pеr sеc 633,31 оpеr pеr sеc 614,30 оpеr pеr sеc 610,11 оpеr pеr sеc 552,25 оpеr pеr sеc 529,96 оpеr pеr sеc 535,94 оpеr pеr sеc 529,96 -3,54% 773,527 -0,65% 1242,7 -3,84%

Win7x64 i3-330M: 60К обращений в 10 тридов к localhost@nginx133
Тест 1 Тест 2 Тест 3 Тест 4 Тест 5 Тест 6 Тест 7 Тест 8 Тест 9 Тест 10 Мин Средн Макс
ab_mingw440_win32.exe 1 345,75 оpеr pеr sеc 649,22 оpеr pеr sеc 624,88 оpеr pеr sеc 1 111,28 оpеr pеr sеc 1 144,01 оpеr pеr sеc 648,48 оpеr pеr sеc 809,03 оpеr pеr sеc 1 394,04 оpеr pеr sеc 625,69 оpеr pеr sеc 646,52 оpеr pеr sеc 624,88 -3,45% 899,89 -3,39% 1394,04 0,00%
ab_vs2008_amd64.exe 1 274,83 оpеr pеr sеc 648,92 оpеr pеr sеc 655,22 оpеr pеr sеc 1 385,00 оpеr pеr sеc 652,66 оpеr pеr sеc 646,19 оpеr pеr sеc 1 341,99 оpеr pеr sеc 684,25 оpеr pеr sеc 659,04 оpеr pеr sеc 1 366,79 оpеr pеr sеc 646,19 0,00% 931,489 -0,35% 1385 -0,64%
ab_vs2008_win32.exe 1 375,10 оpеr pеr sеc 648,70 оpеr pеr sеc 641,77 оpеr pеr sеc 1 338,72 оpеr pеr sеc 644,24 оpеr pеr sеc 629,18 оpеr pеr sеc 1 383,01 оpеr pеr sеc 1 382,51 оpеr pеr sеc 644,14 оpеr pеr sеc 663,93 оpеr pеr sеc 629,18 -2,75% 935,13 0,00% 1383,01 -0,78%




























Win7x64 i3-330M: 60К обращений в 20 тридов к localhost@nginx133
Тест 1Тест 2Тест 3Тест 4Тест 5Тест 6Тест 7Тест 8Тест 9Тест 10МинСреднМакс
ab_mingw440_win32.exe1 329,93 оpеr pеr sеc1 371,66 оpеr pеr sеc1 387,50 оpеr pеr sеc654,44 оpеr pеr sеc1 383,01 оpеr pеr sеc623,36 оpеr pеr sеc656,68 оpеr pеr sеc623,36-2,24%1058,082857-8,43%1387,5-0,32%
ab_vs2008_amd64.exe1 392,02 оpеr pеr sеc1 392,02 оpеr pеr sеc649,03 оpеr pеr sеc1 341,52 оpеr pеr sеc1 241,49 оpеr pеr sеc624,27 оpеr pеr sеc1 379,54 оpеr pеr sеc624,27-2,09%1145,6985710,00%1392,020,00%
ab_vs2008_win32.exe1 367,28 оpеr pеr sеc1 331,31 оpеr pеr sеc680,25 оpеr pеr sеc993,32 оpеr pеr sеc1 379,04 оpеr pеr sеc637,20 оpеr pеr sеc767,08 оpеr pеr sеc637,20,00%1022,211429-11,89%1379,04-0,92%



Win7x64 i3-330M: 500 обращений в 10 тридов к google.ru
Тест 1Тест 2Тест 3Тест 4Тест 5Тест 6Тест 7Тест 8Тест 9Тест 10МинСреднМакс
ab_mingw440_win32.exe3,98 оpеr pеr sеc4,18 оpеr pеr sеc3,99 оpеr pеr sеc3,92 оpеr pеr sеc3,89 оpеr pеr sеc3,890,00%3,9920,00%4,180,00%
ab_vs2008_amd64.exe4,23 оpеr pеr sеc3,95 оpеr pеr sеc3,37 оpеr pеr sеc3,75 оpеr pеr sеc3,97 оpеr pеr sеc3,37-0,08%3,854-0,01%4,230,00%
ab_vs2008_win32.exe3,74 оpеr pеr sеc3,90 оpеr pеr sеc3,68 оpеr pеr sеc3,84 оpеr pеr sеc3,88 оpеr pеr sеc3,68-0,03%3,808-0,02%3,9-0,02%

































WinXPx32@VirtualBox: 500 обращений в 10 тридов к google.ru
Тест 1 Тест 2 Тест 3 Тест 4 Тест 5 Тест 6 Тест 7 Тест 8 Тест 9 Тест 10 Мин Средн Макс
ab_mingw440_win32.exe 2,25 оpеr pеr sеc 2,05 оpеr pеr sеc 3,31 оpеr pеr sеc 3,31 оpеr pеr sеc 2,58 оpеr pеr sеc 2,05 -0,06% 2,7 0,00% 3,31 0,00%
ab_vs2008_win32.exe 2,44 оpеr pеr sеc 2,59 оpеr pеr sеc 2,58 оpеr pеr sеc 2,49 оpеr pеr sеc 2,69 оpеr pеr sеc 2,44 0,00% 2,558 -0,01% 2,69 -0,04%


Выводы:
0: На ноутбуке нельзя проводить производственное тестирование, т.к. он живет своей собственной жизнью даже при отключенных энергосберегающих опциях!!!
1: Все три скомпилированных кода работают примерно одинаково (погрешность менее 1-5-10%)
2: Код скомпилированный MinGW хотя и больше по размеру, но не уступает по производительности коду скомпилированному Visual C/C++ (а иногда и выигрывает (незначительно, но выигрывает!!! :))) ))
3: Переход на компилятор x64 не оправдан для программ использующих менее 2GB RAM ни по производительности скомпилированного кода, ни по количеству танцев с бубнами.

Я выкладываю результаты своих изысканий (http://yadi.sk/d/u2E9NRpg3HJ-E):
1) Исходники с проектными файлами для QT+Mingw, Visual Studio
2) Откомпилированные exe-шники (VS2008x32, VS2008x64, MinGWx32)
3) Результаты тестов в txt и xls форматах

Крайне поучительно будет взглянуть на
1) Настройки QT+Mingw, Visual Studio для компиляции исходников Apache
2) Особенности настройки проектных файлов .pro для QT Creator
3) Особенности написания .bat файлов для замены функций Linux под Windows ;)

Я был бы признателен, если бы кто-нибудь взял бы на себе тяжкий труд по тестированию производительности на десктопной/серверной машине данных программ при этом переключаясь между несколькими OS: WindowsXPx32, Windows7x64, Linux32, Linux64, а затем бы поделился результатами.