Why WinDbg is unable to load symbols from Windows Server 2003 with Service Pack 2 x86 retail symbols download?

7.3k views Asked by At

I wrote a C++ project called 'Foo' using Microsoft Visual Studio 2005 Verison 8.0.50727.762 (SP.050727-7600) on Windows XP Professional Version 2002 Service Pack 3. I built the project into Foo.exe. Then, I copied the file Foo.exe to a Windows Server 2003 Enterprise Edition Service Pack 2. It runs fine.

Now, I try to debug it using WinDbg:6.12.0002.663 X86 Version 5.2.

No symbol path, source path or image path is set

When I open C:\foo\Foo.exe from the 'File > Open Executable' menu, I see this error:

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

Foo.pdb is not present in the same folder where Foo.exe is present. Why do I not see an error for Foo.exe?

On running the command ld * in WinDbg, I see these errors:

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

Now, let me show two attempts to fix it. One worked, the other didn't.

Downloading Windows Server 2003 with Service Pack 2 x86 retail symbols didn't work

I went to http://msdn.microsoft.com/en-us/windows/hardware/gg463028 and downloaded:

Windows Server 2003 with Service Pack 2 x86 retail symbols, all languages (File size: 154 MB - Most customers want this package.)

I ran it and installed the symbols in C:\Symbols. In WinDbg, I set the symbol path as:

C:\Symbols;C:\MySymbols

C:\MySymbols contained the symbol for Foo.exe which had a file-name: Foo.pdb.

On opening C:\foo\Foo.exe from the 'File > Open Executable' menu, I got the same error mentioned in the previous section.

However, the ld * command showed fewer errors this time.

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

Using Microsoft Symbol Server fixed it

This time I set the symbol path as:

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

Now, on opening C:\foo\Foo.exe from the 'File > Open Executable' menu, I got no errors. I found that C:\microsoftsymbols\ntdll.pdb\F7024C7F15FE4BEA992FF38BE58AC11C2\ntdll.pdb was downloaded automatically.

This time ld * command also ran fine without any errors.

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

The following additional symbols were downloaded automatically while the command was running.

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

Questions

  1. Why did I not see an error regarding symbol file for Foo.exe when no symbol path was specified?
  2. 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?

More information

In case it helps you to answer my question, here is my system details as obtained from winmsd.exe > System Summary:

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

There are 2 answers

0
Zipper On BEST ANSWER

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

Answer to 1:

You did when windbg tried to load the symbols for Foo

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

The reason that it didn't show up when you first loaded was that windbg didn't try to load the symbols at first for foo. Most likely because Foo had yet to be called. The program was just starting up and your program logic hadn't actually been called yet.


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?

Answer to 2:

I can't say with 100% certainty, but most likely security patches had been applied so that the pdbs that were included with the retail symbols didn't include the changes. When you went to MS site you can get all the symbols for all released versions of the DLLs including patched versions.

0
snoone On

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

While the previous answer is correct, note that image files contain a reference the build location of their PDBs by default. Thus, it's possible for WinDBG to magically find the PDB for an image that you built on your local machine. This is explained in more detail here:

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