O Estranho Caso do PDB Mal-Aformado
Wanderley Caloni, 2015-08-19

#debugging #pdb #símbolos #windbg #visual studio #2003 #2013 #fórum #stack overflow #mismatch #itoldyouso #i told you so

Era uma vez, há 13 anos atrás, um tal de Visual Studio .NET, que iria trazer a felicidade para nós, meros mortais usuários de programinhas em C com ponteiro pra lá e ponteiro pra cá. Agora a Microsoft traria para o pessoal do “baixo nível” a mais nova novidade do verão: uma IDE lenta, bugada e… bonita?

Bem, para os que estavam acostumados com o Visual C++ 6.0, nada foi mais incômodo do que esperar carregar o programa de manhã para conseguir finalmente compilar. Ajustadas as expectativas, os projetos foram aos poucos migrados para aquela nova forma de configurar EXEs, DLLs, LIBs e OCXs.

E eis que alguém, muito provavelmente eu mesmo, naquele momento de inspiração, criei a seguinte configuração para a geração dos PDBs, os símbolos para depurar programas no Windows:

Faz sentido, não? Afinal de contas, o PDB costuma ter o nome do projeto, e ele já está setado até em outro lugar para gerar com o mesmo nome. Nada de novo no front.

Até aí tudo bem. Aliás, tudo ficou muito bem por estranhos 13 anos.

Até que alguém decidiu migrar para o já não tão novo Visual Studio 2013!

E tudo correu muito bem por algumas horas… talvez 13.

Até que a depuração de repente parou de funcionar.

Será o benedito? Ou o co-piloto?

Pesquisando nos fóruns da vida, antro dos desesperados, achei/lembrei de um comando muito útil no WinDbg que não apenas diz se os símbolos estão “mismatch”, ou seja, os símbolos ou o PDB não está combinando com o EXE, mas também por quê.

Bom, para saber se está mismatch é aquela fórmula de bolo:

ntdll!LdrpDoDebuggerBreak+0x2b:
77e13bad cc              int     3
0:000> .symfix
No downstream store given, using C:\Tools\DbgTools(x86)\sym
0:000> !sym noisy
noisy mode - symbol prompts on
0:000> .reload /f Module.exe
SYMSRV:  C:\Tools\DbgTools(x86)\sym\Module.pdb\7CD3DD6A80254CE29E8A2E8D7C26BF1B2\Module.pdb not found
SYMSRV:  http://msdl.microsoft.com/download/symbols/Module.pdb/7CD3DD6A80254CE29E8A2E8D7C26BF1B2/Module.pdb not found
DBGHELP: C:\Users\Caloni\Projects\Project\Source\_Output\bin\Debug\Module.pdb - mismatched pdb
DBGHELP: Couldn't load mismatched pdb for C:\Users\Caloni\Projects\Project\Source\_Output\bin\Debug\Module.exe
*** WARNING: Unable to verify checksum for Module.exe
*** ERROR: Module load completed but symbols could not be loaded for Module.exe
DBGHELP: Module - no symbols loaded

Para saber o que está errado, o famigerado !IToldYouSo

Mano, como assim?!?!? Eu acabei de compilar esse binário, eu já apaguei 15 vezes as pastas de Debug e Release, eu já rebootei mais do que o Windows me obriga a rebootar por causa das falhas de segurança.

Pois, então, desesperançado, crio um projeto novo para comparar as configurações, e voltamos 13 anos atrás, naquele fatídico dia, e entendo por que o nome do PDB temporário não é igual. Bom, na verdade não entendo, mas intuo que tenha alguma relação:

E, de fato. Solução? Copie as configurações usuais do “novo” Visual Studio comparando com o velho.

Abaixo a chamada do suporte em inglês, se alguém achar o mesmo problema em algum fórum e quiser “espalhar a palavra”.

Just got stuck in the same problem, but in a C++ source that has 13 years, where its first solution was in VS 2003. Comparing the Project Properties in C/C++, Output Files, Program Database File Name, I found out that the project was pointing to the same file path that Linker, Debugging, Generate Program Database File, when the normal situation is to generate a vc120.pdb. Comparing with a new project, the "right" value can't be $(OutDir)$(TargetName).pdb (ou ProjectName), but $(IntDir)vc$(PlatformToolsetVersion).pdb. That solved the problem. I hope solve another one's problem as well =)

[]s

Minha próxima tarefa, aparentemente, é ver como sendo sócio da BitForge e da Intelitrader, e mesmo tendo já atualizado meu perfil MVP há anos, continuo sendo funcionário da UOL Diveo/Broker =/