Depurando até o fim do mundo e de volta de novo: source server com GitHub

Caloni, 2015-05-26 computer blog

Semana passada fiquei sabendo que o vídeo da minha palestra "Depurando até o fim do mundo" do TDC 2014 estava disponível online. Resolvi assistir para ver se aprendia alguma coisa. A despeito do palestrante não ser lá aquelas coisas, ele disse uma coisa interessante: com o Debugging Tools (WinDbg para os íntimos) seria possível além de indexar os símbolos (PDBs para os íntimos) usando o esquema de Symbol Server que a própria Microsoft adota: usar ferramentas do pacote para conseguir obter o fonte através de um símbolo indexado.

E de onde viria esse fonte? Bom, a priori é necessário que exista algum controle de fonte para que as versões estivessem já "indexadas" nesse controle e fossem mapeados com strings internas no PDB. Através dessas strings o WinDbg ao analisar um crash dump ou até mesmo depurando um processo com o uso do PDB conseguiria baixar os fontes automagicamente desse controle de fonte, desde que ele estivesse acessível (na internet, na intranet da própria empresa, na rede, em um disco rígido externo ou na própria máquina do desenvolvedor que não quer se matar para conseguir obter a versão exata dos fontes daquele binário).

O detalhe que o palestrante (Caloni é o nome do sujeito) citou era que já existiam scripts prontos para realizar essa tarefa para os controles de fonte mais comuns, sendo que os mais comuns são: Source Safe (?????), CVS (????????) e, claro, Subversion! (?!?!?!?!??!??!?!). OK, pelo visto o pessoal da Microsoft mora em uma caverna ou não estão muito interessados em indexar os fontes para alguns controles de fonte que estão surgindo por aí, como Git sendo um exemplo aleatório.

Já que o tal do Caloni disse que ainda não fizeram scripts para controles mais modernos. Nenhum descentralizado ainda está na lista. Os scripts são feitos em Perl, ou seja, estão disponíveis em uma linguagem um pouco mais fácil que .BAT. Ou talvez não. De qualquer forma, não parece muito difícil de entender a dinâmica do WinDbg e simplesmente gerar o que tem que gerar dentro dos PDBs.

Pensando nisso, resolvi fazer uma primeira versão, em Python, de um script em que você passa alguns dados e ele processa seus PDBs. Depois você pode jogá-los em um Symbol Server e quando o WinDbg encontrá-lo através de um binário analisado, este irá conter o endereço no GitHub e um comando do Curl para baixá-lo, passando a exibi-lo imediatamente na tela do WinDbg.

O funcionamento é muito simples, mas pede muitos parâmetros (recomendo criar um batch para armazená-los). Então vejamos:

  • dbgtools é o caminho onde está o Debugging Tools for Windows;
  • pdbpath é o caminho de onde devem ser pegos os PDBs, como um output da vida;
  • projname é porque preciso do nome do projeto com escopo do usuário para compor a URL, e.g. Caloni/GitIndex;
  • repo é o caminho do repositório local, pois o remoto eu já consigo pegar com o projname.

Um detalhe importante: o revno que será usado é o HEAD do repositório local. Sim, futuramente podemos adicionar esse argumento como opcional. Porém, no momento, coisas mais urgentes devem ser feitas. Uma delas é que estou usando a visualização raw do GitHub para conseguir pegar um único arquivo-fonte, e para isso uso a ferramenta curl. Ou seja, quem é de Windows vai precisar baixar uma de suas versões e deixar no path do sistema. Quem não é de Windows... o que você está fazendo com um PDB, rapaz?

2026-04-03 Este foi um projeto embrião de onde surgiu a ideia da palestra, mas isso acabou nunca indo para a frente. Houve um momento que eu configurei um symbol server e indexei os símbolos para baixar do controle de fonte, mas os resultados ainda estavam muito crus para ser levado a sério. Hoje onde trabalho os executáveis lançados conseguem baixar os símbolos, mas fica a seu critério selecionar a versão dos fontes que melhor encaixam com essa versão. Eu diria que é a solução mais sana.

[comment] [Logs em serviços (e outras coisas)]