{"id":48,"date":"2009-11-09T15:51:33","date_gmt":"2009-11-09T14:51:33","guid":{"rendered":"http:\/\/blog.kalmbach-software.de\/de\/2009\/11\/09\/source-indexing-tfs-und-smbols-store\/"},"modified":"2009-11-09T16:59:28","modified_gmt":"2009-11-09T15:59:28","slug":"source-indexing-tfs-und-smbols-store","status":"publish","type":"post","link":"http:\/\/blog.kalmbach-software.de\/de\/2009\/11\/09\/source-indexing-tfs-und-smbols-store\/","title":{"rendered":"Source-Indexing (TFS) und Symbol-Store"},"content":{"rendered":"<p>Wer von Euch kennt das Problem: Der Kunde hat ein Absturz oder einen H\u00e4nger Deines Programmes. Das einzige was Du bekommst ist ein Dump-File (z.B. entweder via <a href=\"http:\/\/msdn.microsoft.com\/en-us\/isv\/bb190483.aspx\">WER<\/a> oder durch eigenes schreiben von <a href=\"http:\/\/blog.kalmbach-software.de\/2008\/12\/13\/writing-minidumps-in-c\/\">MiniDumpWriteDump<\/a>).<br \/>\nJetzt beginnt f\u00fcr Dich das Problem:<\/p>\n<ol>\n<li>Welche Version hat der Kunde?\n<li>Welche Source-Files brauche ich f\u00fcr diese Version?\n<li>Wo zum teu.. sind nochmals die passenden PDBs und EXEn f\u00fcr diese Version?\n<\/ol>\n<p>Mit diesem Fragen braucht man sich nicht besch\u00e4ftigen, wenn man bei seinem Build Prozess noch zus\u00e4tzlich zwei Dinge einbaut<\/p>\n<ol>\n<li>Source-Indexing\n<li>Symbols-Store\n<\/ol>\n<h3>Source-Indexing (mit dem TFS)<\/h3>\n<p>Source-Indexing sorgt daf\u00fcr, dass in die Debug-Symole (PDB-Dateien) auch zus\u00e4tzlich noch ein verweis auf die richtige TFS-Version eingef\u00fcgt wird. Dadurch kann der Debugger (z.B. VS) man mit der PDB-Datei genau den passenden Source aus dem TFS holen, mit dem die DLL\/EXE gebuildet wurde.<br \/>\nUm dies zu machen braucht man zwei Dinge: &#8220;<a href=\"http:\/\/www.microsoft.com\/whdc\/DevTools\/Debugging\/\">Debugging Tools For Windows<\/a>&#8221; und &#8220;<a href=\"https:\/\/www.activestate.com\/activeperl\/downloads\/\">ActivePerl<\/a>&#8220;). Das Source-Indexing findet sich bei den Debugging Tools im Unterverzeichnis &#8220;srcsrv&#8221; (also z.B. C:\\Program Files\\Debugging Tools for Windows\\srcsrv). Da die &#8220;Skripts&#8221; (leider) in Perl geschrieben sind, ist auch noch ActivePerl notwendig. Es reicht aber, wenn man die <a href=\"http:\/\/downloads.activestate.com\/ActivePerl\/Windows\/5.10\/ActivePerl-5.10.1.1006-MSWin32-x86-291086.zip\">ZIP-Datei<\/a> runterl\u00e4dt und vor dem Aufruf einfach den Pfad auch noch auf das entpackte ActivePerl setzt.<\/p>\n<p>Damit beim Source-Indexing auch der korrekte TFS-Server verwendet wird, muss man in der Datei &#8220;srcsrv.ini&#8221; die Zeile mit &#8220;MYSERVER&#8221; auf den richtigen TSF zeigen lassen.<br \/>\n<code>MYSERVER=http:\/\/my-tfs-machine:8080<\/code><\/p>\n<p>Jetzt muss man nach einen Build nur noch das Source-Indexing aufrufen und angeben, wo denn der Workstore und die PDBs liegen. Ich gebe der Einfachheithalber immer den Root aller Projekte an, welche ich gebuildet habe. Die Natchdatei sieht dann z.B. so aus (es kann auch direkt als eigenes Task in msbuild laufen):<br \/>\n<code lang=\"DOS\"><br \/>\nrem Merke mit mal den aktuellen Pfad, was die Root meiner Projekte und Ausgabe ist<br \/>\nset srvOrgDir=%CD%<\/p>\n<p>rem Setze den pfad auch zu dem Perl Zeugs...<br \/>\npath=%path%;\"%CD%\\Tools\\srcsrv\\ActivePerl-5.10.1.1006-MSWin32-x86-291086\\perl\\bin\"<\/p>\n<p>rem Wechsle in das Verzeichnis wo die Source-Indexing Tools liegen (liegt bei mir auch im TFS)<br \/>\ncd .\\Tools\\srcsrv<\/p>\n<p>rem Rufe das Source-Indexing auf<br \/>\ncall tfsindex.cmd -ALLROOT=\"%srvOrgDir%\"<\/p>\n<p>rem Setze wieder den urspr\u00fcnglichen Pfad<br \/>\ncd \/D %srvOrgDir%<br \/>\n<\/code><\/p>\n<p>Alternativ kann man nat\u00fcrlich auch das srcsrv-Verzeichnis im TFS ablegen (so hab ich es gemacht), dann muss man nicht sicherstellen, dass man auf dem Build-Rechner auch die Debugging-Tools installiert hat.<\/p>\n<p>Jetzt sollten nach einem Build alle PDB-Dateien mit der korrekten TFS-Version indiziert worden sein (dies erkennt man daran, dass ziemlich weit hinten in der PDB-Datei Eintr\u00e4ge mit &#8220;MYSERVER&#8221; kommen&#8230;; kann man z.B. in Notepad anschauen).<\/p>\n<h3>Symbol-Store<\/h3>\n<p>Oben haben wir jetzt die PDB-Dateien mit dem passenden Verweis auf den TFS ausgestattet. Jetzt m\u00fcssen wir nur noch sicherstellen, dass wir zu einem beliebigen sp\u00e4teren Zeitpunkt nicht mehr nach dieser PDB-Datei (und den dazugeh\u00f6rigen EXEn) suchen m\u00fcssen. Dies geschieht am einfachsten mit dem &#8220;symstore&#8221; aus den Debugging Tools for Windows. Dies speichert einfach alle PDBs\/EXEn in ein Verzeichnis (am besten ein Netzwerkverzeichnis, wenn es sp\u00e4ter mehrere Verwenden wollen).<br \/>\nDas ablegen erfolgt dann ganz Simple durch:<br \/>\n<code lang=\"DOS\"><br \/>\n.\\Tools\\SymStore\\Symstore.exe add \/r \/f .\\*.* \/s G:\\MyProject\\SymbolStore\\Files \/t \"Project Name\"<br \/>\n<\/code><\/p>\n<p>Das war alles \ud83d\ude09<\/p>\n<h3>Einstellungen in VS<\/h3>\n<p>Ok, fast&#8230; denn man will das ganze ja auch noch verwenden&#8230; dazu muss man in VS noch ein paar Einstellungen machen, da per default der &#8220;Source-Server&#8221; deaktiviert ist. Dies muss aktiviert werden:<br \/>\n<a href=\"http:\/\/blog.kalmbachnet.de\/files\/SourceServerSupport01.PNG\"><img decoding=\"async\" src=\"http:\/\/blog.kalmbachnet.de\/files\/SourceServerSupport01.PNG\" \/><\/a><\/p>\n<p>Jetzt muss man noch den Pfad zu den zuvor abgelegten Dateien eintragen:<br \/>\n<a href=\"http:\/\/blog.kalmbachnet.de\/files\/SourceServerSupport02.PNG\"><img decoding=\"async\" src=\"http:\/\/blog.kalmbachnet.de\/files\/SourceServerSupport02.PNG\" \/><\/a><\/p>\n<p>Bekommt man jetzt ein Dump oder will in dieser EXE\/DLL debuggen, so werden die Sourcen direkt vom TFS geholt (und in einem tempor\u00e4ren Verzeichnis gespeichert) und man kann dies dann direkt debuggen.<\/p>\n<p>Ich hoffe, dass hilft dem ein oder anderen.<\/p>\n<p>PS: Beide Verfahren werden \u00fcbrigens auch intern von Microsoft schon sehr lange eingesetzt (deswegen auch das Source-Indexing in Perl; PowerShell gab es damals noch nicht). Die gesamten Windows Sourcen sind so indiziert und (der wer darf \ud83d\ude09 ) k\u00f6nnen dann via CCP die passenden indizierten PDB-Dateien abgefragt werden, welche dann z.B: in VS\/WinDbg die passenden Source runterl\u00e4dt.<\/p>\n<p>PPS: Wer das ganze noch f\u00fcr SubVersion haben will, kann es bei Stefan nachlesen:<br \/>\n<a href=\"http:\/\/mcblogs.craalse.de\/sku?title=source_server_und_symbol_server_setup_mi\">Source Server und Symbol Server Setup mit Subversion<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wer von Euch kennt das Problem: Der Kunde hat ein Absturz oder einen H\u00e4nger Deines Programmes. Das einzige was Du bekommst ist ein Dump-File (z.B. entweder via WER oder durch eigenes schreiben von MiniDumpWriteDump). Jetzt beginnt f\u00fcr Dich das Problem: Welche Version hat der Kunde? Welche Source-Files brauche ich f\u00fcr diese Version? Wo zum teu.. [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,3,5],"tags":[],"class_list":["post-48","post","type-post","status-publish","format-standard","hentry","category-alles-uber-dotnet-programmierung","category-alles-uber-die-echte-windowsprogrammierung","category-wpf"],"_links":{"self":[{"href":"http:\/\/blog.kalmbach-software.de\/de\/wp-json\/wp\/v2\/posts\/48","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.kalmbach-software.de\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.kalmbach-software.de\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.kalmbach-software.de\/de\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.kalmbach-software.de\/de\/wp-json\/wp\/v2\/comments?post=48"}],"version-history":[{"count":0,"href":"http:\/\/blog.kalmbach-software.de\/de\/wp-json\/wp\/v2\/posts\/48\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.kalmbach-software.de\/de\/wp-json\/wp\/v2\/media?parent=48"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.kalmbach-software.de\/de\/wp-json\/wp\/v2\/categories?post=48"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.kalmbach-software.de\/de\/wp-json\/wp\/v2\/tags?post=48"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}