2012-01-19 5 views
3

Я написал проект C++ под названием «Foo» с помощью Microsoft Visual Studio 2005 Verison 8.0.50727.762 (SP.050727-7600) в Windows XP Professional Version 2002 с пакетом обновления 3. Я построил проект в Foo.exe. Затем я скопировал файл Foo.exe в пакет обновления 2 (SP2) для Windows Server 2003 Enterprise Edition. Он работает нормально.Почему WinDbg не может загружать символы из Windows Server 2003 с пакетом обновления 2 x86 розничных символов?

Теперь я пытаюсь его отладить с помощью WinDbg: 6.12.0002.663 X86 Version 5.2.

Нет путь символа, путь источника или путь изображения установлен

Когда я открываю C:\foo\Foo.exe из 'File> Open выполняемого' меню, я вижу эту ошибку:

*** ERROR: Symbol file could not be found. Defaulted to export symbols for ntdll.dll - 

Foo.pdb отсутствует в той же папке, где присутствует Foo.exe. Почему я не вижу ошибку для Foo.exe?

На выполнении команды ld * в WinDbg, я вижу эти ошибки:

0:000> ld * 
*** ERROR: Module load completed but symbols could not be loaded for Foo.exe 
Symbols loaded for Foo 
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\WINDOWS\system32\msvcrt.dll - 
Symbols loaded for msvcrt 
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\WINDOWS\system32\kernel32.dll - 
Symbols loaded for kernel32 
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.6195_x-ww_44262B86\MSVCR80.dll - 
Symbols loaded for MSVCR80 
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.6195_x-ww_44262B86\MSVCP80.dll - 
Symbols loaded for MSVCP80 
Symbols already loaded for ntdll 

Теперь, позвольте мне показать две попытки, чтобы исправить это. Один работал, другой - нет.

Загрузка Windows Server 2003 с пакетом обновления 2 x86 розничных символов не работает

Я пошел http://msdn.microsoft.com/en-us/windows/hardware/gg463028 и загрузить:

Windows Server 2003 with Service Pack 2 x86 retail symbols, all languages (Размер файла: 154 MB - Большинство клиентов хотят этот пакет.)

Я запустил его и установил символы в C:\Symbols. В WinDbg я установил путь символа как:

C:\Symbols;C:\MySymbols 

C:\MySymbols содержал символ foo.exe, который имел имя-файла: Foo.pdb.

При открытии C:\foo\Foo.exe из меню «Файл> Открыть исполняемый файл» я получил ту же ошибку, о которой упоминалось в предыдущем разделе.

Однако команда ld * показала меньше ошибок на этот раз.

0:000> ld * 
Symbols loaded for Foo 
Symbols loaded for msvcrt 
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\WINDOWS\system32\kernel32.dll - 
Symbols loaded for kernel32 
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.6195_x-ww_44262B86\MSVCR80.dll - 
Symbols loaded for MSVCR80 
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.6195_x-ww_44262B86\MSVCP80.dll - 
Symbols loaded for MSVCP80 
Symbols already loaded for ntdll 

Использование Microsoft Symbol Server, установил его

На этот раз я установить путь к символам, как:

SRV*C:\MicrosoftSymbols*http://msdl.microsoft.com/download/symbols;C:\MySymbols 

Теперь об открытии C:\foo\Foo.exe из 'File> Open выполняемым' меню, У меня нет ошибок. Я обнаружил, что C:\microsoftsymbols\ntdll.pdb\F7024C7F15FE4BEA992FF38BE58AC11C2\ntdll.pdb был загружен автоматически.

На этот раз команда ld * также прошла нормально, без ошибок.

0:000> ld * 
Symbols loaded for Foo 
Symbols loaded for msvcrt 
Symbols loaded for kernel32 
Symbols loaded for MSVCR80 
Symbols loaded for MSVCP80 
Symbols already loaded for ntdll 

Следующие дополнительные символы были загружены автоматически во время выполнения команды.

C:\microsoftsymbols\kernel32.pdb\BE496DC9472F4438B080C70594D8F9CC2\kernel32.pdb 
C:\microsoftsymbols\msvcp80.i386.pdb\E8A9423E890A4ADDB38F8F756268437C1\msvcp80.i386.pdb 
C:\microsoftsymbols\msvcr80.i386.pdb\54C9E2F351544D1CB39517DC4B299EA81\msvcr80.i386.pdb 
C:\microsoftsymbols\msvcrt.pdb\A7F38CEE7E684B94B7AA9FFFCAB446851\msvcrt.pdb 

Вопросы

  1. Почему я не вижу ошибку относительно символьного файла для foo.exe, когда не был указан путь символа?
  2. Зачем загружать Windows Server 2003 с пакетом обновления 2 x86 в розничные символы и указывать путь к нему, поскольку путь к символу не работает?

Дополнительная информация

В случае это поможет вам ответить на мой вопрос, вот мои детали системы, полученной из winmsd.exe> ​​Сведения о системе:

OS Name: Microsoft(R) Windows(R) Server 2003, Enterprise Edition 
Version: 5.2.3790 Service Pack 2 Build 3790 
Other OS Description : Not Available 
OS Manufacturer: Microsoft Corporation 
System Name: EULER 
System Manufacturer: VMware, Inc. 
System Model: VMware Virtual Platform 
System Type: X86-based PC 
Processor: x86 Family 16 Model 4 Stepping 2 AuthenticAMD ~2417 Mhz 
Processor: x86 Family 16 Model 4 Stepping 2 AuthenticAMD ~2416 Mhz 
BIOS Version/Date: Phoenix Technologies LTD 6.00, 7/22/2008 
SMBIOS Version: 2.4 
Windows Directory: C:\WINDOWS 
System Directory: C:\WINDOWS\system32 
Boot Device: \Device\HarddiskVolume1 
Locale: United States 
Hardware Abstraction Layer: Version = "5.2.3790.3959 (srv03_sp2_rtm.070216-1710)" 
User Name: Not Available 
Time Zone: India Standard Time 
Total Physical Memory: 3,839.45 MB 
Available Physical Memory: 1.56 GB 
Total Virtual Memory: 5.60 GB 
Available Virtual Memory: 3.33 GB 
Page File Space: 2.00 GB 
Page File: C:\pagefile.sys 

ответ

2

Why did I not see an error regarding symbol file for Foo.exe when no symbol path was specified?

Ответ до 1:

Вы сделали, когда windbg попытался загрузить символы для Foo

0:000> ld * 
    *** ERROR: Module load completed but symbols could not be loaded for Foo.exe 
    Symbols loaded for Foo 

Причина, по которой она не появилась при первой загрузке, заключалась в том, что windbg не пытался сначала загружать символы для foo. Скорее всего, потому, что еще не вызвал Фу. Программа только начиналась, и ваша программная логика еще не была вызвана.


Why downloading Windows Server 2003 with Service Pack 2 x86 retail symbols and specifying the path to it as the symbol path didn't work?

Ответ на 2:

Я не могу сказать со 100% уверенностью, но, скорее всего, патчи безопасности были применены так, что PDB-файлы, которые были включены с розничными символами не включают изменения. Когда вы перешли на сайт MS, вы можете получить все символы для всех выпущенных версий DLL, включая исправленные версии.

0

Why did I not see an error regarding symbol file for Foo.exe when no symbol path was specified?

Хотя предыдущий ответ верен, обратите внимание, что файлы изображений содержат ссылку на место сборки своих PDB по умолчанию. Таким образом, WinDBG может волшебным образом найти PDB для изображения, которое вы создали на своей локальной машине. Это объясняется более подробно здесь:

http://analyze-v.com/?p=245