{"id":708,"date":"2013-01-16T16:23:30","date_gmt":"2013-01-16T22:23:30","guid":{"rendered":"http:\/\/www.lastdragon.net\/?p=708"},"modified":"2013-01-16T16:23:30","modified_gmt":"2013-01-16T22:23:30","slug":"a-la-caza-del-bug-dll-not-found-in-distributed-application","status":"publish","type":"post","link":"https:\/\/www.lastdragon.net\/?p=708","title":{"rendered":"A la caza del BUG : DLL not found in distributed application."},"content":{"rendered":"<p>M.A. Roberto Flores Santiago<br \/>\nEmail: roberto.flores.consultoria (at) hotmail.com<\/p>\n<p>En este peque\u00f1o art\u00edculo, intentar\u00e9 describir el camino que segu\u00ed y las herramientas que utilic\u00e9, para cazar un bug, al cual agradezco mucho, ya que por su culpa aprend\u00ed muchas cosas.<br \/>\nEmpezare por describir la aplicaci\u00f3n en la cual el bug se manifest\u00f3 (no sin antes gritar mas de un improperio porque no aparec\u00eda, sin embargo si provocaba desmadres.)<br \/>\n&#8211;\tSistema, una descripci\u00f3n breve.<br \/>\nRecuerden que trabajo en una empresa en la que debido a los acuerdos de confidencialidad, no puedo revelar nombres de aplicaciones, ni lo que en realidad hace la aplicaci\u00f3n, as\u00ed que para fines pr\u00e1cticos la llamaremos: Alien Proxy Server (recuerdan el tweet de Alien Technology -> aqui).<br \/>\nLa aplicaci\u00f3n est\u00e1 construida sobre .NET 4.0, lenguaje de programaci\u00f3n C#, ORM Fluent NHibernate, DBMS SQLite, IDE Visual Studio 2010, Utilizando Librer\u00edas desarrolladas en casa en lenguaje C++ como DLLs.<br \/>\nEsta aplicaci\u00f3n, utiliza entre otras cosas, dos tipos de webservices, REST y SOAP para recibir la informaci\u00f3n, procesarla y reenviarla (como todo proxy que se precie de serlo), a trav\u00e9s de sockets de .NET.<br \/>\n&#8211;\tConfiguraciones de Software en los que fue probado el sistema.<br \/>\nWindows 7 Ultimate, Windows Server 2008 R2, Windows Vista, Windows XP SP3 Profesional.<br \/>\n&#8211;\tConfiguraciones de software<br \/>\nNo requeridas.<\/p>\n<p>Ingredientes para crearse un problema parecido al que me paso (ver t\u00edtulo del articulo), agregue librer\u00edas en C++ compiladas en modo DEBUG a su aplicaci\u00f3n en  C#, compile y haga el PUBLISH de su aplicaci\u00f3n, instale su aplicaci\u00f3n en la maquina donde fue desarrollada, y hasta aqu\u00ed no tendr\u00e1 aun ning\u00fan problema, ahora bien, entregue la aplicaci\u00f3n al usuario final, d\u00edgale que la instale y pong\u2026.BUG a la vista, la aplicaci\u00f3n se cay\u00f3.<br \/>\nEl problema en si, es que le sistema, hasta este punto no le dar\u00e1 a ud. Ning\u00fan inicio de donde carajos se aloja el BUG, le indicara alguna l\u00ednea mafufa de c\u00f3digo y Ud. Empezara a cazar el bug, aislar los m\u00f3dulos, a quitar funcionalidades, debido a que el fallo solo sucede en las maquinas que no son de desarrollador, Ud. Incluso instalara el IDE en alguna de las pcs, en las cuales existe el problema y el problema desaparecer\u00e1 como por arte de magia, no se enga\u00f1e solo, el BUG aun est\u00e1 ah\u00ed, solo que ud no lo sabe.<\/p>\n<p>Despu\u00e9s de varios d\u00edas de b\u00fasqueda sin saber que es, y de aislar m\u00f3dulos, funciones y dem\u00e1s parafernalia developer, decide quitar todos los DLLs, recuerde que aun aquel mensaje de: DLL not found in distributed application. Aun no ha hecho su aparici\u00f3n, as\u00ed que al quitar todos los DLLs en C++, su problema desaparece, bueno, si solo los referencia sin utilizarlos, el programa funcionara en maquinas no developers, pero eso no le ayuda en nada, lo que ud. Quisiera es no reescribir esas 4,000 l\u00edneas de c\u00f3digo en C#, porque el tiempo de entrega es para ayer.<br \/>\nBueno, ya se dio cuenta que son los DLLs, ahora se concentra con todo el poder de la fuerza e inicia la cacer\u00eda en serio, visita varios blogs, p\u00e1ginas de Microsoft, foros, stackoverflow.com, en fin se mete ud. En lo m\u00e1s profundo de la ayuda en l\u00ednea ayudado con la herramienta m\u00e1s poderosa del universo: Google, bueno acompa\u00f1ado de su ignorancia, porque sin ella, ud no estar\u00eda en esta penosa situaci\u00f3n y con un BUG de lo m\u00e1s desgraciado en su querid\u00edsima aplicaci\u00f3n.<br \/>\nBueno, para no darle m\u00e1s vueltas al asunto, en alg\u00fan momento, al correr la aplicaci\u00f3n en una maquina no developer, el famoso error sale a la luz: DLL not found in distributed application. &#8211;Hola yo soy la causa de tus problemas\u2014<br \/>\nCon esa misma frase, copy &#038; paste en google, segundos despu\u00e9s, aparece una referencia a alguien que tuvo el mismo grado de ignorancia que ud, el mismo error. \u2013 ver la liga en las referencias\u2014<br \/>\nEn este caso, uno no lo cree, pero as\u00ed es, al compilar nuestras librer\u00edas DLLs en C++, se nos olvid\u00f3 compilarlas en modo rel\u00e9ase, las compilamos en modo DEBUG, eso conlleva a que en mi caso particular, mi DLL, llama a un DLL de sistema, llamado: MSVCR100D.DLL que solo existe en maquinas con un IDE instalado, porque como la letra D, al final de su nombre lo indica, esas DLLs son para utilizarse en modo DEBUG, y no existen en m\u00e1quinas no developers, ok como llegu\u00e9 a esa conclusi\u00f3n. Bueno aparte que lo le\u00ed en alguna de las ligas de referencia, en alguna de ellas me recomendaron utilizar una herramienta llamada: dependency Walker \u2013ver liga de referencia\u2014esta excelente herramienta, abre su ejecutable o DLL, y le dice a ud con pelos y se\u00f1ales, todas las dependencias que deber\u00edan estar en presentes en una m\u00e1quina para que funcione correctamente, si alguna no estuviese presente, el programita se lo se\u00f1alara en amarillo, \u00bfHermoso no? Procedemos a darnos cuenta que esa librer\u00eda es la que falta y que ho, no existe en ninguna maquina no developer.<\/p>\n<p>Soluci\u00f3n: Proceda a compilar sus librer\u00edas en C++ en modo rel\u00e9ase (Si Ud. esto ya lo sab\u00eda, siento mucho que haya llegado hasta aqu\u00ed). Refer\u00e9ncielas de nuevo en su proyecto C#, haga el PUBLISH de su aplicaci\u00f3n y su asunto quedara arreglado.<br \/>\nSi por curiosidad vuelve ud a aplicarle la llave china con el Depedency Walker al DLL, se dar\u00e1 cuenta que ahora la referencia es a la librer\u00eda MSVCR100.DLL, si ud. Ve este nombre y lo compara con el anteriormente detallado, el nombre difiere porque esta no tiene una D. ahhhh, esta es la que est\u00e1 presente en todas las maquinas, sean developer o no.<\/p>\n<p>Referencias:<br \/>\nhttp:\/\/stackoverflow.com\/questions\/7603243\/dll-not-found-in-distributed-application<br \/>\nhttp:\/\/msdn.microsoft.com\/en-us\/library\/dd293565.aspx<br \/>\nwww.dependencywalker.com<\/p>\n<blockquote class=\"twitter-tweet\" data-width=\"500\" data-dnt=\"true\">\n<p lang=\"en\" dir=\"ltr\">Software Analyst: Why can not we give this machine for us, to test the software?<br \/>Manager software: two words, alien technology.<\/p>\n<p>&mdash; Robert Revolver (@robertrevolver2) <a href=\"https:\/\/twitter.com\/robertrevolver2\/status\/289401518011084800?ref_src=twsrc%5Etfw\">January 10, 2013<\/a><\/p><\/blockquote>\n<p><script async src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>M.A. Roberto Flores Santiago Email: roberto.flores.consultoria (at) hotmail.com En este peque\u00f1o art\u00edculo, intentar\u00e9 describir el camino que segu\u00ed y las herramientas que utilic\u00e9, para cazar un bug, al cual agradezco mucho, ya que por su culpa aprend\u00ed muchas cosas. Empezare por describir la aplicaci\u00f3n en la cual el bug se manifest\u00f3 (no sin antes gritar&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[],"class_list":["post-708","post","type-post","status-publish","format-standard","hentry","category-de-terceros"],"_links":{"self":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/708","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=708"}],"version-history":[{"count":0,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/708\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=708"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=708"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=708"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}