Published
by

Comments

# pmackay said on Wednesday, August 11, 2004 11:07 AM

Loco, no deberías usar ">" y esas cosas para que aparezcan los símbolos?

# pmackay said on Wednesday, August 11, 2004 2:32 PM

Sí, pero traté con varias opciones, pero siempre le daba por interpretarlo como script.

# pmackay said on Wednesday, August 11, 2004 7:37 PM

Me sumo a tu idea y además me parece que sería bueno incluso si uno la implementa utilizando el patrón Strategy, se aplica cundo se tiene un conjunto de algoritmos para solucionar un mismo problema de esa forma entonces alguien podría utilizar sin mucho esfuerzo distintas variantes de paginación de hecho podría incluso hasta generar una clase colocada en la UIP que se especialice en la paginación y determine cual criterio aplicar.

Esto teniendo en cuenta que Patrick habla de un algoritmo yo menciono otro pero en realidad existen algunos más que recuerde en éste momento he visto uno basado en tablas temporales, otro en RowCount, etc. Cada uno tiene distintos niveles de respuesta y posibilidad de aplicación en dependencia de la solución y la necesidad planteada.

# pmackay said on Wednesday, August 11, 2004 7:57 PM

Luisón, me aparecen las siguientes dudas:

¿Es la UIP la encargada de determinar el criterio?
¿Eso implicaría que la UIP debe conocer todos los criterios?. ¿No es responsabilidad de datos tomar esa decisión?

De los algoritmos, por supuesto que hay mas.

Lo que a mi no me gusta de las tablas temporales es que producen un efecto similar a la segunda metodología ya que hay mucha copia de datos.

# pmackay said on Thursday, August 26, 2004 6:31 PM

Completamene de acuerdo, es super bueno el Ants Profiler. pero lo de bajar el IIS es una lata, por ultimo debería bajarlo el mismo (uno siempre es comodo).

Hernan Maldonado

# pmackay said on Friday, August 27, 2004 10:06 AM

Pero efectivamente lo hace solo... para nuestra comodidad.

# pmackay said on Friday, August 27, 2004 1:55 PM

Me parece que si es la UIP pero la parte de presentación directamente, la parte de proceso de presentación, en la capa de datos no creo pues no sabe para que se quieren los datos y puede ser un elemento importante a tener en cuenta a la hora de decidir el algoritmo.

# pmackay said on Thursday, September 23, 2004 4:08 PM

Esta excelente este aporte !!!!
Muy bien explicado . . .

# pmackay said on Thursday, September 23, 2004 4:37 PM

Muchas gracias.

# pmackay said on Friday, November 05, 2004 5:18 AM

Muy util.. justo lo que necesitaba. mi enhorabuena por el articulo.

# TrackBack said on Monday, November 08, 2004 11:13 PM

Como caducar una página de asp.net

# TrackBack said on Sunday, November 28, 2004 12:14 AM

Subject: RE: Descargar archivo de base de datos

# pmackay said on Wednesday, December 22, 2004 1:39 AM

Patrick

Me alegra que pierdas tu virginidad en el campo del crackeo, pero lo que más me llama la atención es que existan herramientas con esos niveles de protección un Simple y Asqueroso IF, te imaginas si ese mismo código se genera en tiempo de ejecución, como se puede hacer con .Net, no darías con el por lo menos de esa forma y te costaría un poco y tendrías que usar herramientas un poco más potentes, aunque nadie dice que sea imposible, pero por lo menos no tan simple.
Ahora bien esto no es un problema nuevo, los desarrolladores de java ya pasaron por esa etapa solo que nosotros ahora nos estamos adentrando en las interioridades de la nueva plataforma y comenzamos en realidad a estresarla. Te recomiendo para tú tranquilidad pon en el que todo lo sabe “Google” Java+Descompilación y te llevarás una sorpresa.
Si analizamos que para muchos la técnica de ofuscamiento consiste en: cambiar en el momento de compilación el nombre de clases, métodos, variables, etc, por cadenas generadas de forma automática, permitiendo que al hacer una descompilación las cosas sean más difíciles y la estructura del programa no sea tan evidente, queda suficientemente claro con tu ejemplo que no porque algo diga que ofusca el código en realidad se toma su trabajo en serio
De todas formas patrick te muestro otro ejemplo de cómo hacerlo sin recompilar. Para esto solo necesitas una editor hexadecimal (hex)(Como hace mucho que no hago esto fue lo que más me costó hacer, encontrar uno que me gustar, caprichos de cubano). Como no pones el código IL real donde está la comparación yo lo agrego

ldc.i4.s 100
ble.s L_0027 esto claramente puede cambiar en tú código


Entonces si tenemos en cuenta que ldc.i4.s es en hex 1F y 100 en hex es 64 y además ble.s es 31 entonces puedo abrir con cualquier editor hex y buscar 1F6431 cuando lo encuentre puedo chequear un par de instrucciones anteriores y posteriores para estar seguro de que estoy en la zona correcta y luego hago el siguiente cambio 1F64 que no es más que cargar en memoria 100 ahora lo cambio por 1F00 cargar en memoria cero y además cambio 31 por 30 que es bgt.s.
Resultado mostrado por reflector una vez hecho el cambio.

ldc.i4.s 0
bgt.s L_0027

y entonces tu programa funcionará para cualquier archivo con más de cero líneas. Creo que es suficiente esa cantidad de líneas.

Por lo que podemos decir que para el nuevo código aplican algunos trucos antiguos, cosa que no me asusta en lo particular, soy de los convencidos de que si alguien se empeña en hacer daño lo más probable que lo logre si:
1. Sí el código no está bien escrito
2. Herramientas no profesionales de desarrollo
3. Capacidad de procesamiento Infinito
4 Paciencia infinita
5 Tiempo infinito

Saludos

Luison.Net

# TrackBack said on Wednesday, December 22, 2004 4:49 PM

What have I done? Patrick gets cracking

# pmackay said on Tuesday, December 28, 2004 10:59 PM

De esa forma es mas rapida, pero requiere tener los conocimientos de hexadecimal y editores hexadecimales, además de mucha mas paciencia. En este caso, lo que quería mostrar era que con 0 conocimiento y las herramientas básicas, se puede crackear un programa.

Concuerdo totalmente que la validación utilizada es bastante idiota y eso es responsabilidad de los desarrolladores, o al menos de alguien por que si la base de tu empresa con las ventas y la diferencia entre vender y no vender esta en 1 SOLO IF, entonces ahi hay problemas.

Saludos.

# pmackay said on Monday, January 31, 2005 5:43 PM

Amigo, estoy tratando de utilizar el codigo que indicas para impersonar, pero no he podido hacer que ejecute correctamente. estoy utlizando un servidor 2000 server. ¿es necesario realizar alguna configracion en especial?

correo: acc20@hotmail.com

# pmackay said on Friday, February 18, 2005 5:03 AM

Muy buen estudio Patrick. Te felicito por haberte tomado tu tiempo en la investigación. Trataré de repetir el proceso y estudiarlo también.

Un abrazo,

Jorge

# pmackay said on Friday, February 18, 2005 9:25 AM

Gracias Jorge.

Algo que me llama la atencion es que al ocurrir esto, la programación en la página y en code behind no son compatibles. Es mejor adoptar uno u otro modelo. La mezcla te puede generar problemas no fáciles de resolver.

Saludos.

# pmackay said on Tuesday, March 01, 2005 6:26 AM

Mirando este y otros foros sobre este asunto, he llegado a la conclusión de que estas cosas no sirven para nada, tanto estas como otras que ha con cookies y tal.

La única forma que se me ha ocurrido para hacer esto es que apartir de que entren en tu aplicación ir machacando la entrada anterior del histórico con la actual.

podrían venir basicamente de 2 maneras:

o haciendo ya un:

document.location.replace('mipagina.html , .php, .asp, .loquesea');

con lo cual ya no tendriamos problemas ya que esta función lo hace automatico.

O haciendo un href, un submit o cualquier otra forma de llamar a una pagina.

de esta otra manera deberíamos machacar la entrada de historico anterior, o sea borrar la entrada del previous.

Con esto que conseguiriamos, que cuando dieran al boton atras en cualquiera de sus variantes saliera del ambito de nuestra aplicación ya que solo tenemos escrita una entrada en el histórico.

Entiendo que los botones volver de nuestra aplicación no estan hechos ni con

document.history.go(-1);

ni

history.back();

ni guarrerias de este tipo.

# pmackay said on Wednesday, April 27, 2005 3:54 PM

Hola Patrick, en relación al artículo Paginación de registros V2.0, se me presenta la duda de como haces cuando un usuario visita más páginas y no tienes las claves cargadas en la cache. Es decir en el artículo hablas de tener 501 claves e ir cargando registros de 50 en 50 a cada petición, pero que ocurre si un usuario solicita la página 11, 12, etc. como actualizas la cache de claves?

Escribí un correo a través de la página preguntando lo mismo.
Disculpa las molestias.
Sergio

# pmackay said on Wednesday, April 27, 2005 4:38 PM

Sergio,

había visto tu mensaje, pero no habia tenido oportunidad de contestarlo.

C/R a tu pregunta, no tengo un respuesta probada funcionando, pero podrías complementarlo con un sistema de bloques de páginas, en donde almacenas en caché los 500 ids de cada bloque de 10 páginas. Si el usuario llega a la página 11 podrías buscar los nuevos 500 ids. Otra forma es obtener solo 250 ids nuevos y descartar los 250 de las primeras 5 paginas, quedandote con 10 paginas, de la 6 a las 15.

Esto puede funcionar sin problemas para las primeras páginas, pero a medida que avanzas hacia adelante irremediablemente se pondrá mas lento el obtener estas "super paginas" ya que tendrías que utilizar un algoritmo TSQL del tipo "select where not in (select)", el cual es muy lento.

Te puedo preguntar, que necesidad hay de llegar mas allá de 500 registros?. Nosotros no lo hemos necesitado. Por eso quiero conocer tu necesidad.

Saludos.
Patrick.

# pmackay said on Thursday, April 28, 2005 3:41 AM

Hola Patrick

El problema se plantea para cualquier aplicación windows de gestión. El usuario está acostumbrado a tener la típica botonera de Primero, Anterior, Siguiente y Ultimo para navegar por los registros.
El volumen máximo de registros para ciertas tablas (pedidos, albaranes, ...) será >50000, clasificadas por empresa, ejercicio, serie... Donde en un momento dado un usuario al entrar a ver un listado puede trabajar con 2000-8000 registros para luego como bien indicas mirar los 40 o 50 primeros registros y salir, pero aun así debo tener la posibilidad de que quiera posicionarse en cualquier registro que se encuentre fuera de los límites de la caché, por ejemplo por que anda buscando alguno en concreto que no está entre los que busca.

No se me ocurre ninguna forma eficiente que solucione el problema. Ahora que estoy haciendo pruebas la cache de Ids es del total de registros (3000-8000) y no va mal. Como ventaja al tener en cache todos los Id's siempre puedo cargar la página que contiene el registro que anda buscando sin ningún problema. No obstante no termina de convencerme.

Gracias por contestar
Sergio

# pmackay said on Thursday, April 28, 2005 10:45 AM

Voy a tomar una frase tuya y mostrarte un camino que a lo mejor no has notado. Tu dices "por ejemplo por que anda buscando alguno en concreto que no está entre los que busca".

Por que no entonces le das opciones de filtro, varias opciones para que pueda acotar sus resultados?.

Nosotros tenermos entre 6 y 10 filtros por busqueda, entonces, mi defensa es que con ese nivel de filtrado y los 500 registros que retorna, DEBE poder encontrar cualquier cosa. Sinó es así, el usuario no sabe lo que anda buscando y ahi entramos en otro problema.

Patrick.

# pmackay said on Saturday, April 30, 2005 12:57 AM

I would like more information about the Capa de Negocios. My name is Claudia and I am from Bolivia . I am a student of system ingeneering . I would like too about of abstract data

Help me please. Write me

# pmackay said on Tuesday, May 03, 2005 6:16 AM

Hola Patrick

Ante la respuesta a mi pregunta no tengo ninguna duda de que tienes razón, muchas veces (por no decir siempre) el usuario no sabe bien lo que anda buscando. Así que lo enfocaré de la forma que me indicas.

Gracias.

Otra cosa, tengo dudas de cómo debo descargar de memoria un dataset que hayamos cargado (Por ejemplo el primero con 25 registros) al releer otra página de datos (otros 25 registros). Lo comento porque aunque haga lo siguiente:

objdataset.clear()
objdataset.dispose

previamente antes de recargar de nuevo con los siguientes 25 registros el consumo de memoria sube, y a cada nueva página o registro que me desplace sube y sube, nunca baja o se mantiene. Este comportamiento de la memoria es normal o estoy haciendo algo mal. He leido algunos artículos sobre este tema pero al probarlos ninguno hace que la memoria se libere. Entiendo que el GC no actua en el mismo instante en el que el objeto ya ha salido de ámbito, pero aun así me parece excesivo el consumo de memoria.

En VB6 cuando cargabas un objeto en memoria y después lo liberabas el consumo bajaba, pero en .NET no da esa sensación.

Algún consejo?


Gracias de antemano.

# pmackay said on Tuesday, May 03, 2005 10:39 AM

Sergio,

la utilización de memoria en .net sigue una regla muy simple. Si el equipo tiene memoria disponible todavia, la usa. El framework no libera memoria cuando no es necesario. El garbage collector no limpia inmediatamente los registros marcados a nothing, de hecho, no necesario hacerlos = nothing.

Tu debieras ver que la memoria utilizada sube, pero en algun momento dejará de subir y se mantendrá estable. Rara vez verás que baje, a menos que tengas otro proceso corriendo que la necesite. Es una lucha entre las aplicaciones y el sistema operativo.

Patrick.

# pmackay said on Thursday, May 26, 2005 3:10 PM

Hola saludos me interesa mucho este tema ya que en este area me he desenvuelto mucho desde chavo le agradeceria al autor de esta informacion me pueda explicar un poco mas sobre como usar las contraseñas hash ya que he saca unas cuantas pero al intentra utilizarlas me es un poco dificil ya que aun no entiendo que es enrealidad los bugs que abren o que bulnerabilidades puedo ver y usar saludos ATTE
nando

# pmackay said on Wednesday, August 10, 2005 12:21 PM

Saludos Patrick, exceleten Articulo, el asunto que es el Termino "Crackear" se usa para fines ilicitos o incorrecto, existe una herramienta que se llama SALAMANDER.NET, el cual a pesar de el codigo estar Ofuscado lo llega mostrar tanto en Codigo IL, como en Codigo Nativo.

en tanto pondre en practica expuesto en tu articulo para ver de Usar Otro Prodcuto aparte del Ofuscator.


Saludos

Ricardo Hinostroza

# pmackay said on Friday, August 19, 2005 1:26 PM

Nada que decir... al igual que tu,
soy un amigo cercano del .Net Reflector


Slds.
Javier

# pmackay said on Wednesday, August 24, 2005 10:26 AM

Hola. Me llamo Eugenio y llevo unos meses estudiando VB.NET, e traducido el código que ahi pones a VB y me interesa poder desencripatar, para mis aplicaciones. Me podías envíar a mi correo (eecsaky@hotmail.com) el código para desencriptar.

Un saludo, eecsaky

# pmackay said on Wednesday, August 24, 2005 3:09 PM

Eugenio,

la encriptación Hash no es posible de desencriptarla. Si tu buscar un algoritmo que puedas encriptar y desencriptar de forma segura, debes utilizar algoritmos simetricos. Te recomiendo que utilices Rijndael.

Fijate en este otro post : http://msmvps.com/pmackay/archive/2004/11/27/21085.aspx

Saludos.

Patrick.

# pmackay said on Sunday, September 04, 2005 3:10 PM

Hola =)

Pues me sirvo bastante esta buscando sobre encriptacion asimetrica y despues de leer esto me quedo claro...

Nos vemos
Saludos ;)

# pmackay said on Tuesday, September 20, 2005 12:32 PM

Muy explicativo, sin embargo quería saber si es posible que tengas un ejemplo en VB Net. Gracias por tu aporte. ulatealejandro@yahoo.com

# pmackay said on Friday, October 07, 2005 9:52 AM

Patrick:

Me gustaría que me enviaras la PPT de la exposición del 6/10. La encontré buena y donde entregaste variados elementos que permiten realmente optimizar.

Gracias.
Fernando Carvallo

# pmackay said on Friday, October 07, 2005 10:21 AM

Sorry, pensé que el zip tenía los sql. Gracias

# pmackay said on Friday, October 07, 2005 11:23 AM

Patrick:
Felicitaciones por la charla, muy buena, te quería pedir si me puedes enviar los archivos necesarios para analizar el plan de ejecución con los archivos de sql7.
mi correo es amerino@previred.com

Gracias.

# pmackay said on Friday, October 07, 2005 11:53 AM

Patrick:
Estuvo muy buena la charla y bastante práctica, te felicito. Gracias por tu esfuerzo, pues se noto que te preparaste.
Saludos,
Jorge Ojeda

# pmackay said on Friday, October 07, 2005 12:03 PM

Muchas Gracias por sus comentarios.

Acabo de colocar los archivos de SQL 7.

Patrick.

# pmackay said on Friday, October 07, 2005 1:05 PM

Patrick:
Te felicito por la charla, me aclaraste muchas dudas. Muchas gracias

# pmackay said on Friday, October 07, 2005 3:13 PM

Patrick:

Me sumo a las felicitaciones, no solo se notó que la charla estaba muy bien preparada, sino que tu disposición para seguir respondiendo consultas fue excelente.

Saludos
Patricio Galarce

# pmackay said on Friday, October 07, 2005 4:02 PM

Gracias a todos por sus comentarios.

Me falto además la instrucción para saltarse los bloqueos de tablas, al momento de hacer lecturas.

Se debe tener cuidado ya que esto produce lecturas sucias.

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

# pmackay said on Friday, October 07, 2005 4:33 PM

Excelente charla. Si bien justo ahora estoy con otro RDBMS, creo que podré extrapolar muchas ideas y aprovecharlas bastante.
Muchas gracias por el esfuerzo, la calidad y tu buena disposición.

# pmackay said on Friday, October 07, 2005 5:37 PM

Me sumo a las felicitaciones, se agradece tener la oportunidad de asistir a este tipo de charlas donde el tema se puede poner en práctica con técnicas que nunca están de más en cualquier sistema.

# pmackay said on Sunday, October 23, 2005 3:46 PM

entendi tu explicacion , desde pequeño me a llamadola atencion el tema de , desecriptar ya q me gusta saber que hay detras de lo que los otros no ven, no me gusta dañar, solo por curiosidad empeze, pero ahora , mesiento demaciado atraido por este tema , tengoalgunos soft pero noson presisos ( Al 100%), pero confiables, me gustaria q me mandaras algunos si es q llegas a tener o tienes , ok ciao

ATTE

alexander b.

genio.tan@gmail.com

# la visión de un ingeniero de campo said on Wednesday, January 31, 2007 7:56 PM

Como mencioné en el post Encriptación Asimétrica, existe una versión más funcional que combina algorítmos asimétricos y simétricos. Debido a que la encriptación asimétrica es casi 1000 veces más lenta que la simétrica, cuando la información a encriptar

# la visión de un ingeniero de campo said on Tuesday, February 06, 2007 10:00 PM

Hace algunas semanas estuve de visita en un cliente, en donde me encontré con una aplicación que cada

# la visión de un ingeniero de campo said on Sunday, March 11, 2007 3:33 PM

Después de una extenuante semana en Buenos Aires que me obligó a estar offline casi todos los días, me

# Juan Pablo Garcia said on Wednesday, March 14, 2007 7:49 PM

Buenisimo tema, llego ese día por lo que no creo que pueda ir. Lamento perdermela.

salu2

# pmackay said on Thursday, March 15, 2007 5:27 AM

JP, sería un placer contar con vuestra presencia. En otra oportunidad será.

saludos,

# la visión de un ingeniero de campo said on Tuesday, March 27, 2007 11:59 PM

Para quienes venimos del desarrollo utilizando Visual Basic 6.0, una de las primeras cosas que nos enseñan al empezar a utilizar código manejado (framework), es que ya no es necesario liberar la memoria porque “.net lo hace por ti”. Esta última parte

# la visión de un ingeniero de campo said on Tuesday, March 27, 2007 11:59 PM

Para quienes venimos del desarrollo utilizando Visual Basic 6.0, una de las primeras cosas que nos enseñan al empezar a utilizar código manejado (framework), es que ya no es necesario liberar la memoria porque “.net lo hace por ti”. Esta última parte

# la visión de un ingeniero de campo said on Wednesday, March 28, 2007 12:05 AM

Para quienes venimos del desarrollo utilizando Visual Basic 6.0, una de las primeras cosas que nos enseñan al empezar a utilizar código manejado (framework), es que ya no es necesario liberar la memoria porque “.net lo hace por ti”. Esta última parte

# la visión de un ingeniero de campo said on Saturday, April 21, 2007 5:14 PM

Estas últimas semanas han estado un poco aburridas. No se han presentado problemas de aplicaciones pero

# la visión de un ingeniero de campo said on Sunday, April 29, 2007 8:16 PM

Hablaremos de cómo se auto adiestra el GC para realizar recolecciones de memoria en una frecuencia medianamente determinada, con el fin de impactar lo menos posible el rendimiento de la aplicación.

# la visión de un ingeniero de campo said on Sunday, April 29, 2007 8:16 PM

Hablaremos de cómo se auto adiestra el GC para realizar recolecciones de memoria en una frecuencia medianamente determinada, con el fin de impactar lo menos posible el rendimiento de la aplicación.

# la visión de un ingeniero de campo said on Sunday, April 29, 2007 8:18 PM

Hablaremos de cómo se auto adiestra el GC para realizar recolecciones de memoria en una frecuencia medianamente determinada, con el fin de impactar lo menos posible el rendimiento de la aplicación.

# la visión de un ingeniero de campo said on Sunday, May 13, 2007 5:32 PM

Mientras investigaba para la segunda parte del artículo ¿Por qué debo definir "debug=false"

# miguel said on Thursday, May 17, 2007 1:42 PM

Super interesante pero no me queda claro para que sirve: numRecompilesBeforeAppRestart

gracias

# pmackay said on Thursday, May 17, 2007 1:53 PM

Miguel,

esa propiedad permite configurar la cantidad de modificaciones que puedes hacer a los archivos aspx, ascx y asmx antes de que tu aplicacion sea reiniciada.

En la segunda parte, que debiera terminarla esta semana, lo detallaré de forma mas completa, con ejemplos e impacto.

Saludos,

Patrick

# Amigo mío Siempre estas Programando en .NET said on Tuesday, May 22, 2007 9:48 AM

En mi anterior artículo hablaba sobre la importancia de este atributo de configuración en las aplicaciones

# Eber Irigoyen said on Tuesday, May 22, 2007 11:16 AM

wow... asi como para WTF, y que haces en esos casos?

# Eber Irigoyen said on Tuesday, May 22, 2007 11:23 AM

pmackay- es curioso que unas entradas salen con full feed y otras no... cual es el criterio? si pudieras poner todas las entradas en full feed seria excelente salu2

# Leandro said on Tuesday, May 22, 2007 3:31 PM

Felicitaciones! Excelente artículo, me abrió los ojos.

# pmackay said on Tuesday, May 22, 2007 8:23 PM

yyy...es muy difícil, porque en este caso, lo que se tendía que haber hecho es botar todo y comenzar de nuevo. Es difícil hacer reingeniería con algo así. El problema es muy de fondo.

Otra opción que se usa bastante en algunas empresas es “arreglar” estos problemas agregando más hardware. Para mí, esa es una pésima solución (aunque te puede salvar por un rato),  pero entras en un ciclo donde irremediablemente, tarde o temprano, deberás arreglar la aplicación.

Conozco un caso donde “arreglaron” con hardware hasta que llegaron a 30 máquinas. Hicieron una gran reingeniería (tarde, pero al fin), y lograron hacer funcionar todo con sólo 4 maquinas. Al menos espero que ellos hayan aprendido la lección.

Saludos,

Kent

# pmackay said on Tuesday, May 22, 2007 8:27 PM

Eber,

He estado haciendo algunas modificaciones en algunos posts para dejarlos en html plano y simple, como en los viejos tiempos. Cuando lo copio desde Word, agrega una cantidad descomunal de caracteres y estilos.

Si me puedes mencionar uno que salga bien y otro mal, puedo ver dónde está la diferencia. Te lo agradecería mucho.

Saludos,

Patrick

# pmackay said on Tuesday, May 22, 2007 8:30 PM

Siempre un placer.

Patrick.

# la visión de un ingeniero de campo said on Wednesday, May 23, 2007 12:24 AM

En la primera parte de este artículo revisamos parte del impacto de definir debug ="true" en

# la visión de un ingeniero de campo said on Wednesday, May 23, 2007 12:24 AM

En la primera parte de este artículo revisamos parte del impacto de definir debug ="true" en

# la visión de un ingeniero de campo said on Wednesday, May 23, 2007 12:26 AM

En la primera parte de este artículo revisamos parte del impacto de definir debug ="true" en

# Bryan said on Thursday, May 24, 2007 11:23 AM

Patrick,

Están muy interesantes los articulos de memoria. Gracias por la información. Te comento una situación para ver si te ha sucedido: Yo soy programador de C++, ahora que estoy programando en C#, y todo objeto que creo lo destruyó mediante un dispose o un utilizando el using.

La destrucción de los ArrayList y otros objetos parecidos me imagino que están relacionado al scope de donde fueron definidos y el garbage collector los destruye.

En este momento la aplicación es un servidor transaccional que tienen un pool de hilos y un hilo que recolecta hilos que hayan muerto y los destruye. Estos hilos del pool según unos criterios crean otros hilos para almacenar info en la bd y se le envia referencia a hilo recolector para que los destruya cuando han terminado.

El problema que tengo es que en Windows XP la memoria se libera bien, no presenta problemas aún bajo alto tráfico transaccional. Pero Windows 2003 no logra liberar la memoria. Mientras en XP la aplicación no sobrepasa los 50Mb, en 2003 llega bajo la misma carga a 200Mb y no baja. He probado enviarla una sobrecarga y dejarlo media hora sin recibir transacciones y la memoria no baja.

Me puedes orientar si hay alguna particularidad de 2003 en un dual core 2 que hace que no se comporte igual que el XP?

Nota: Ya trate de activarle la opción GCServer y no funciona.

Saludos

# darz said on Thursday, May 24, 2007 6:11 PM

Bueno, esta especie se encuentra en abundancia en nuestra fauna chilena, pero lo más simpático de todo es cuando te obligan a usarla, incluso dando uno las razones de por que no se debería usa (perdida de años luz de la forma de desarrollo), pues bien la culpa nunca es del chancho si no del que le da el afrecho.

Tengo claro cual es tu cliente, ya que nació de esa zona esta gran creatividad. Y si necesitas ayuda para poder arreglar el entuerto también puedo aportar con unos lineamientos.

Me ha tocado sufrir por la chispas de genialidades de algunos….

Saludos,

# pmackay said on Friday, May 25, 2007 9:37 AM

Bryan,

Lo que te voy a decir ahora, seguramente no te gustará, porque normalmente no les gusta a la personas que vienen de C++. Los programadores de C++ son muy cuidadosos con la liberación de memoria y prefieren el estilo determinista por sobre el no determinista del GC.

La petición y asignación de memoria por parte del Garbage Collector (GC) se hará sin considerar la cantidad de memoria que ya esté usando éste. Dicho de otra forma, mientras haya memoria disponible en el servidor y no sea requerida por otras aplicaciones o el SO, el GC hará uso de ésta.

Además, en un servidor Windows 2003 Dual Core, hará uso del modo Server del GC. A diferencia de XP (modo Workstation) donde cada bloque asignado al GC de memoria reservada del SO es de 16 MB, en modo server, el bloque más pequeño que reserva el GC es de 64 MB. Esto no significa que toda la memoria este en uso (commit), pero puede darte señales para entender ese comportamiento.

Por  último, si estás mirando la memoria consumida usando Task Manager, lo que estás mirando es el working set y no la memoria privada ni virtual. Mira este link: msmvps.com/.../posts-y-tips-de-baja-calidad-y-el-impacto-de-stos.aspx

Saludos,

Patrick

# pmackay said on Friday, May 25, 2007 9:54 AM

Darz,

Muchas gracias por no dar nombres de clientes. Efectivamente es una fauna que se ha poblado por todo sud América y que tiene poco peligro de extinción. Si por mi trabajo me tocase volar fuera de Sud América podría decir si se ha repartido por todo el mundo.

Si me puedes mandar tu contacto para tenerlo en caso de ser necesario, te lo agradecería. No es necesario lo posees aquí. Puedes mandarme un contacto (msmvps.com/.../contact.aspx) con tus datos.

Saludos,

Kent

# Bryan said on Friday, May 25, 2007 5:04 PM

Gracias por la aclaración. De hecho nombre el task manager pero en realidad es una herramienta que da un profile completo de la aplicación. Al analizar en detalle encontré el problema de la aplicación. En realidad el garbage collector si está haciendo lo suyo, le dí seguimiento mediante unos profilers y encontré que la memoria asignadas a objetos convencionales está siendo relativamente bien administrada. El problema es REFLECTION, en este momento se está ejecutando dinámicamente código generado dependiendo de parámetros del sistema y de los datos o información provenientes de la transacción entrante. Las herramientas detectaron que cuando el CodeDomProvider realiza el CompileAssemblyFromSource se recarga la memoria y está no es fácilmente liberada por el GC por lo que recae en un memory leak. Encontré en varios artículos que dicen que la carga de CódigoDinámico con CodeDomProvider tiene implicaciones en memoria y que su liberación no es simple. En este momento revise información de DynamicMehtod pero me parece "poco flexible", creo que lo mejor es hacer un mini "parser/compiler" para resolver esto. Te agradecería que si conoces de una forma de compilación dinámica que no afecte la memoria en C# y sea eficiente me comentes para investigarla. Gracias por los comentarios de la memoria. Saludos.

# pmackay said on Friday, May 25, 2007 7:35 PM

Bryan,

Mi experiencia con generación y compilación de código dinámico es nula. Sin embargo, de tu respuesta puedo entender que la compilación esté generando un assembly dinámico.

Efectivamente los assemblies dinámicos no se descargar de un dominio de aplicación, y creo que ese es el leak al que haces referencia.

Una recomendación que te puedo dar, pero que debes estudiar bien para que no te afecte el rendimiento de tu aplicación, es la creación de un nuevo dominio (AppDomain) y dentro de éste, hacer la compilación. Después de terminado el proceso, podrás descargar el assembly en memoria descargando el dominio que lo contiene.

Te recalco que la creación y destrucción de dominios no tiene buen rendimiento, pero puede ser una buena alternativa si el código que quieres ejecutar no es considerado crítico en rendimiento.

Saludos,

Patrick.

# Eber Irigoyen said on Monday, May 28, 2007 5:42 PM

usa filemon

# pmackay said on Monday, May 28, 2007 7:52 PM

Eber,

he usado filemon, procmon y otros y además de estar accediendo a la carpeta del índice, no veo que esté leyendo otras zonas del disco....

BUeno...ya le puse reindexar y hasta ahora va bien...

Saludos,

# Amigo mío Siempre estas Programando en .NET said on Wednesday, May 30, 2007 8:15 AM

En mi anterior artículo hice referencia al primer artículo de Patrick donde explicaba la importancia

# ASP.NET Espanol Blogs said on Wednesday, May 30, 2007 8:31 AM

En mi anterior artículo hice referencia al primer artículo de Patrick donde explicaba la importancia

# espinete said on Thursday, May 31, 2007 1:18 AM

Señor, cómo se puede acceder por código y saber si compilation debug es true o false ? Saludos.

# pmackay said on Thursday, May 31, 2007 1:02 PM

Espinete,

mira, no es muy elegante, pero funciona.

using System.Reflection;

bool b;

object o = System.Configuration.ConfigurationSettings.GetConfig("system.web/compilation");

b = (bool)o.GetType().InvokeMember("_debug", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, null, o, null);

b será verdadero o falso en dependiencia del valor de la configuración.

Saludos,

Patrick

# Carlos Kuknow said on Saturday, June 09, 2007 11:07 AM

Muy buena explicacion sobre la distribucion de carga en servidores, como explicas no debe ser mandatorio ni la verdad absoluta, pero ayudaria bastante en ambientes productivos. Bueno ya cuando se realizo la liberacion de carga, segun lo que explicaste... por parte del servidor web o negocio.., el encolamiento estaba en otro lado (como siempre pasa hacia... la base de datos). Saludos.. muy buen articulo..

# pmackay said on Saturday, June 09, 2007 11:53 AM

Amigo Carlos,

tu lo haz dicho. Cada vez que se "destapa" un lado, se tapa otro. Después que ajusten la base de datos se podrá ver si los WS son el cuello de botella, y se repetirá el ciclo.

Saludos,

Patrick

# Eber Irigoyen said on Saturday, June 09, 2007 12:41 PM

muy bueno me pregunto que tan dificil seria crear una aplicacion que nos diera los valores optimos para un servidor, algo que fuera incrementando los valores de estos parametros hasta llegar al balance deseado por el usuario y que fuera mostrando uso de memoria, # de threads, etc... side note: este post no salio en full feed, no se si todavia estes haciendo ajustes salu2

# pmackay said on Saturday, June 09, 2007 1:08 PM

Eber,

a mi juicio, los valores óptimos dependen de tantos "grados de libertad" que lo que para unos usuarios es correcto, para otros puede ser nefasto.

Toma este mismo caso. Si se copian estos valores para un servidor de páginas aspx, las cuales son "pesadas", con viewstate, javascript, grandes listados, etc, seguramente el 95% del hardware "normal" colapsará en minutos. En este caso, como son web services livianos que solo realizan "selects" a la base de datos, y con respuestas breves, si funcionan.

Creo que lo que se quiso hacer con la opción <processModel autoConfig="true"/> del framework 2.0 fue eso mismo, pero a nosotros no nos funcionó y aún no se por qué. Tengo mi hipótesis, pero mientras no la pruebe, prefiero no comentar nada.

Saludos y gracias por tus palabras.

Patrick

# pmackay said on Saturday, June 09, 2007 1:22 PM

Ahora ya entiendo por qué no funciona con autoConfig.

De acuerdo a www.microsoft.com/.../default.aspx, auto config define los mismos valores del libro, es decir, "funciona" definiendo por nosotros valores fijos, sin reconfigurarse si fuese necesario debido a una mayor cantidad de requerimientos y poco uso de CPU. Nada que agregar.

Saludos,

Patrick.

# Javi said on Tuesday, June 19, 2007 11:10 AM

Muy bueno.

Con artículo como este se hace más fácil el paso de Visual Basic 6 a 2005

Gracias

# pmackay said on Sunday, June 24, 2007 2:57 PM

Muchas gracias. Siempre es un gusto aportar...

# Jean said on Saturday, June 30, 2007 12:02 PM

Buen articulo aunque seria mejor si colocas enlaces hacia sitios que profundicen en el tema.

Por ejemplo el mejor plan de mantenimiento segun lo que entiendo de tu articulo en servidores de mucha carga seria eliminar las estadisitcas en horarios de poca carga y recrearlas nuevamente?

# pmackay said on Tuesday, July 03, 2007 6:11 PM

Jean,

si te interesa ver hasta los detalles más mínimos de las estadísticas, puedes ver el libro Inside SQL Server de Kalen Delaney.

www.amazon.com/.../0735609985

En un servidor de mucha carga, si la actualización de estadísticas es un problema, se deberá deshabilitar la actualización automática y hacerlo manualmente cuando la ventana de tiempo lo permita.

saludos,

Patrick.

# cwalzer said on Monday, July 09, 2007 12:46 AM

Hola Patrick, que grata sorpresa es ver el trabajo que estas llevando acabo.  Ya llevo como 3 horas leyendo tu blog, muy interesante.

Un abrazo

# Eber Irigoyen said on Tuesday, July 10, 2007 11:47 AM

es facil echarle la culpa a MS de cosas que pasen en el sistema, yo lo he visto muchas veces...

# pmackay said on Wednesday, July 11, 2007 5:48 PM

Carlos, muchas gracias por la palabras, y honrado por tu visita.

Saludos,

Patrick

# pmackay said on Wednesday, July 11, 2007 5:51 PM

correcto, y en especial cuando el administrador no sabe ni por donde sale el sol...

# la visión de un ingeniero de campo said on Wednesday, July 11, 2007 11:46 PM

Como lo mencioné al terminar el segundo post sobre por qué no deho habilitar debug=true en web.config

# la visión de un ingeniero de campo said on Wednesday, July 11, 2007 11:47 PM

Como lo mencioné al terminar el segundo post sobre por qué no deho habilitar debug=true en web.config

# pmackay said on Thursday, July 12, 2007 12:06 AM

Parece que a alguien lo hicieron entrar en razón.

El mensaje en http://www.vanhalen.net/ cambió radicalmente.

----------------------------------

Sign up for the Van Halen Fan Newsletter Mailing List

June 29, 2007

In an effort to keep you more informed about Van Halen, we have begun the construction of a new database for newsletter/press release recipients.

If you are interested in receiving newsletters and press releases issued by the band, please click the link below to submit your e-mail address and first and last names.

If you have registered for our newsletters in the past, please re-register your information.

----------------------------------

# Gonzalo Balladares R. said on Saturday, July 14, 2007 12:10 PM

Excelente Artículo.

# pmackay said on Saturday, July 14, 2007 11:28 PM

Gracias Eminencia.

# Sergio said on Tuesday, July 17, 2007 5:51 PM

Buen artículo,pero...sigo teniendo una duda.

Como programador, debería de usar el dispose de los objetos que creo.

try

{

 SqlConnection oConn = ...

{

catch...

finally

{

 oConn.Close();

 oConn.Dispose();

}

Saludos. Sergio.

# pmackay said on Tuesday, July 17, 2007 7:57 PM

Sergio,

cuando dices "usar" y "objetos que creo" ¿te refieres a implementar Dispose en tipos definidos por ti o en llamar a dispose de instancias de tipos creadas?

Para los primeros, si vas a manejar recursos no manejados, si debes implementar IDisposable, aunque los recursos no manejados los maneje algun tipo que tu estes manejando. Ejemplo: Si tengo una clase que tiene una propiedad del tipo de conexión a base de datos, tu clase debe implementar Dispose y éste debe llamar al Dispose de la conexión.

Para el segundo caso, que es parecido al ejemplo que posteaste ahí, tienes que garantizar que se llame Dispose, ya sea usando un using o try/finally.

Con esto basta. Dispose llama a close internamente.

try

{

SqlConnection oConn = ...

{

catch...

finally

{

oConn.Dispose();

}

Saludos,

Patrick

# Jako said on Thursday, July 19, 2007 7:45 AM

Excelente blog , lo visitaré más seguido aunque a mi me gustó más Van Halen con David Lee Roth :).

Estaré en tu conferencia el 26 en Microsoft (Eso espero).

# Eber Irigoyen said on Tuesday, July 24, 2007 8:46 PM

bueno, es que cualquier codigo que este en algun tipo de loop (directo o indirecto) se debe analizar mas de cerca

y las excepciones son para casos... ejem... excepcionales

pero esto del tema de las excepciones, me he dado cuenta que es uno de los temas mas dificiles de aprender para los desarrolladores, yo he visto gente con muchos años programando que no saben usar excepciones, asi que que se puede esperar

salu2

# Sixaxis said on Monday, August 13, 2007 6:57 PM

Olaa queria saber si un correo de hotmail se puede desencriptar?

# pmackay said on Monday, August 13, 2007 8:18 PM

Me imagino que te refieres a la contraseña de una cuenta de hotmail, que corresponde a una cuenta de live. En ese caso, las personas de live te podrán responder mejor esa pregunta.

Saludos,

Patrick

# Diegum said on Saturday, September 01, 2007 2:20 PM

Buenísimo Patrick

Coincido contigo y con Eber, no sólo no hay q usar inadecuadamente las excepciones sino también q aún cuando hay que usarlas... es complicado!!

Alguna vez metí un post al respecto

http://diegumzone.spaces.live.com/cns!1pHxrrKG6RzuZjEIZgyJyg0A!150.entry

Quiero recomendar a cualquiera un seminario de Krzysztof Cwalina, el papá de la biblioteca de clases básicas de .NET

www.researchchannel.org/.../displayevent.aspx

Ojo, el seminario dura como 4 horas pero si lo abren y van directo a la hora 2:23 (2 hs 23 mins), Krzysztof cuenta lo bueno, regular y malo de las excepciones, y cómo usarlas inteligentemente

Patrick, un kilo tu blog

# pmackay said on Saturday, September 01, 2007 10:16 PM

Siempre un placer contar con su presencia en mi blog, y más aún, las felicitaciones....

Con respecto a Krzysztof Cwalina, no es joda, pero mi proximo libro es este:

Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries

www.amazon.com/.../002-5670830-6047244

Voy a chequear tu post al respecto y conversamos.......

quedamos pendientes en la conversa de arquitectura el otro día

Saludos,

# Tololo said on Friday, September 07, 2007 7:17 PM

Excelente post patrick,

Las excepciones son claramente una mala opción en este caso, en su reemplazo se deberia usar uno de los metodos TryParse del framework.

Escribí un post al respecto en http://tololo.spaces.live.com/cns!8FBB5BA7A402859A!172.entry

Saludos

# pmackay said on Friday, September 07, 2007 11:20 PM

Totolo,

concuerdo plenamente con tu comentario y el post sobre el tema. Creo que un escenario como este, trycast es más adecuado que las expresiones regulares.

Sin embargo, creo en el uso de expresiones regulares y que hay casos donde son la solución a los problemas.

Lamentablemente, éstas no son estudiadas por lo desarrolladores, probablemente por lo mismo que dices tu, porque son difíciles de entender y aplicar en ciertos escenarios. Aún así, la dificultad no es excusa.

Saludos,

Patrick

# sergiotarrillo said on Wednesday, September 26, 2007 11:51 AM

Patrick, con respecto al postear (si es que aún no encontraste una técnica para hacerlo), lo que hago es usar Windows Live Writer, para crear mis posts, lo copio a Word, para corregir los horrores, y de ahi lo regreso al Writer, y listo :), aunque dicen que el windows live writer tiene corrector ortográfico, pero no lo he habilitado en espaniol...

Por otra lado, grande tu serie de posts :).

Saludos,

# Gsus said on Wednesday, September 26, 2007 12:47 PM

Muy buen post. Me entere que es un look up y tambien me di cuenta de ciertos errores en algunos sps demasiado costosos. Gracias

# pmackay said on Wednesday, September 26, 2007 2:12 PM

Sergio,

hoy en día utilizo Expression Web, que me parece una versión remozada de Frontpage con algunas gracias de Dreamweaver. Hasta ahora, todo bien.

También aprendí a sobrevivir a las pobres explicaciones de las opciones de RSS en esta aplicación de blog. Creo que ya le encontré la vuelta.

Alguna vez usé Live Writer, pero encontré que habían algunas cosillas con el formato que no me gustaban. Puede ser que como era versión beta no estaba del todo afinada.

Saludos,

Patrick.

# pmackay said on Wednesday, September 26, 2007 8:55 PM

por nada....siempre un gusto poder aportar.

Patrick.

# jac said on Friday, October 05, 2007 4:19 AM

Hola, mi gran dilema...¿Cuál creeis que sería el mejor modo de almacenar el salt? Si lo almacenas en la base de datos, el riesgo sería el mismo en caso de que accediera a ella, pues al tener el salt y el hash, el proceso para crackearlo sería el mismo que si no incluyes un salt a la encriptación y no tendría dificultad añadida; el usuario no puede recordar el salt porque es randómico y lo olvidaría; la aplicación no puede contenerlo porque sería inútil.

¿¿Es realmente útil el salt??

# pmackay said on Friday, October 05, 2007 8:46 AM

Jac,

El salt no fue concebido para dar la seguridad que tú mencionas. Si alguien tiene acceso a la base de datos, el salt no proveerá mucha más seguridad.

La utilidad del salt se puede medir en al menos 2 aspectos:

1.- Contraseñas iguales tendrán un hash diferente ya que el salt hará que no sean iguales (las contraseñas finales). Aunque los usuarios ingresen la parte que es igual, tú le concatenas la parte que hace la diferencia.  En este caso, si se llega a comprometer una contraseña, ya sea porque el usuario la dijo o la obtuvieron ilícitamente, no se podrá comparar el hash y decir que estas otras contraseñas son iguales.

2.- Evitar ataques con Rainbow tables. Estas tablas almacenan valores precalculados de contraseña y hash. Es decir, para una contraseña, su hash correspondiente (no tengo mayores conocimientos de rainbow tables, ni como almacenan los hash ni qué algoritmos de hash utilizan). Si utilizas salt, todos los hash precalculados de la tabla no sirven.

¿Se entiende?

Te recomiendo la lectura de este link para que veas más ejemplos.

www.microsoft.com/.../sm1005.mspx

Saludos,

Patrick

# pmackay said on Friday, October 05, 2007 8:48 AM

y respondiendo la otra pregunta, lo puedes alamcenar como un campo de texto en la tabla de usuarios. No es necesario protegerlo más que eso.

Patrick.

# espinete said on Wednesday, October 10, 2007 10:44 AM

Señor, se puede descargar la presentación, demos, código de la charla ??

Saludos.

# pmackay said on Wednesday, October 10, 2007 6:56 PM

Espinete,

todo el material está diponible en el sitio de cafeina.

http://www.cafeina.cl

Saludos,

# Gsus said on Monday, October 15, 2007 4:29 PM

Es curioso que se escriba (escribas -si el "tuteo" es permisible- ) un blog acerca de las pantallas azules cuando la PC de mi casa (WVista Business) la enciendo y pasan cierto numero de minutos y sale una pantalla Azul.

No le puedo echar la culpa al Windows ese error comenzo cuando instale ciertas aplicaciones despues ya de varios meses usando el sistema sin problemas

De acuerdo a lo que leo del blog me queda una duda: Si mi problema no era por drivers porque despues de la formateada volvi a instalar los drivers el problema no aparecio hasta que instale un firewall, el babylon y un programa de maquinas virtuales (vmware),¡Es posible echarle la culpa a esas aplicaciones (ring 3 -creo-) del pantallaso? -Una posible alternativa seria el vmware (ring1) pero eso me trae ciertas dudas ya que la volvi a formatear y no instale el vmware y volvio a aparecer. Error de Hardware quizas pero regrese a una version anterior del C antes de instalar nada y no pasa.

# pmackay said on Monday, October 15, 2007 5:32 PM

GSus,

Es imposible que una pantalla azul sea provocada por una aplicación, salvo que ésta instale drivers que corran en el kernel de Windows.

Interesante lo de VMWare. En el artículo, mencioné Virtual Server y Virtual PC. Tiendo a pensar que VMWare tambien funciona en anilo 1, pero no tengo mayor información.

Si puedes reproducir el problema, cuando ocurra, toma una foto de la pantalla y conversémosla. Espero poder ayudarte a encontrar quién es el culpable, el cual, podría ser código de Vista...quién sabe...

Si te animas a más, configura Vista para que tome un Dump de la memoria del Kernel cuando ocurra y así poder revisarla, aunque ese dump va a pesar algunos gigas.

Saludos,

Patrick

PD: Por supuesto que se puede tutear...

# Eber Irigoyen said on Monday, October 15, 2007 5:40 PM

muy bueno, muy informativo tu articulo!

salu2

# JoeX said on Tuesday, October 16, 2007 12:06 AM

realmente interesante lo recomendare en la universidad, esta muy bueno el articulo y sus curiosodades, de verada hace años k no leo con tanta atencion un blog, muchas gracias, te vas a favoritos =)

# Claudio Pérez said on Wednesday, October 17, 2007 2:01 PM

Patrick

Muy buen post. Yo tuve un experiencia con pantallas azules en Windows 2000. La verdad no tengo el pantallazo y no recuerdo nada de lo que decía, pero despues de probar distintas alternativas de solución, "logré" solucionar el problema cambiando una tarjeta de memoria ram (tenía 2 una de 128MB y una de 256MB). Ponía la tarjeta y pantalla azul, sacaba la tarjeta y todo bién. Mi problema estaba dentro del 10%, problema de hardware (por suerte era la de 128MB).

Saludos,

Claudio Pérz

# Liarjo said on Sunday, October 21, 2007 8:47 AM

Hola,

si hay que hacer apuestas creo que IIS y Google se van a llevar el premio gordo.

salu2

# german said on Wednesday, October 24, 2007 1:50 PM

buen articulo, aclaratorio

lindas pantallas azules .. por ahi tengo el video del bochorno de Gates y su win98 ... un clásico!!

saludos desde el metro Salvador, Stgo de chile

:)

# Pablo said on Wednesday, October 24, 2007 4:48 PM

Existe una utilidad de Sysinternals para "colgar" a Windows a drede, se llama "NotMyFault".

# pmackay said on Wednesday, October 24, 2007 5:21 PM

Pablo,

efectivamente esa aplicación existe, pero tiene dos componentes principales. La interfaz de usuario y un driver de kernel llamado Myfault.sys.

Detalles podrás encontrar en el blog de Mark.

blogs.technet.com/.../unkillable-processes.aspx

Como vimos, los problemas de drivers son los que más problemas le traen a Windows.

Una aplicación no puede botar el sistema si no tiene una "ayuda" en el kernel.

Saludos,

Patrick.

# Gsus said on Friday, October 26, 2007 12:40 AM

De eso me estoy convenciendo. Aun no he tenido tiempo de  conseguir camara y de volver a querer ver una pantalla azul en mi monitor. Hace tiempo que no veo la pantalla azul desde que deje de usar el babylon y el vmware pero aun lo tengo pendiente.Gracias

# apartment » Microsoft.VisualBasic.dll, ??Eres tan malo como dicen? said on Friday, October 26, 2007 9:37 PM

Pingback from  apartment &raquo; Microsoft.VisualBasic.dll, ??Eres tan malo como dicen?

# pmackay said on Monday, October 29, 2007 8:17 AM

Un saludo a los de Apple que creen que su software es infalible. Su recien liberado sistema Mac OS X "Leopard" lanzó sus primeras pantallas azules.

Mas info en:

docs.info.apple.com/article.html

Saludos,

Patrick

# Carlos Walzer said on Friday, November 02, 2007 3:01 PM

Para confirmar lo que mi amigo Patrick MacKay explica en estos 3 artículos: ¿Por qué debo definir &quot;debug

# Carlos Walzer said on Friday, November 02, 2007 3:01 PM

Para confirmar lo que mi amigo Patrick MacKay explica en estos 3 artículos: ¿Por qué debo definir &quot;debug

# Carlos Walzer said on Friday, November 02, 2007 3:01 PM

Para confirmar lo que mi amigo Patrick MacKay explica en estos 3 artículos: ¿Por qué debo definir &quot;debug

# alejandro said on Saturday, November 10, 2007 11:25 PM

como hago para ver el codigo de io.dll es para hacer un trabajo de la universidad y me urge...

muchas gracias

mi correo es alevilla86@hotmail.com

# alejandro said on Saturday, November 10, 2007 11:26 PM

como hago para ver el codigo de io.dll es para hacer un trabajo de la universidad y me urge...

muchas gracias

mi correo es alevilla86@hotmail.com

# pmackay said on Sunday, November 11, 2007 6:49 AM

Alejandro,

puedes usar reflector para ver el codigo IL de los ensamblados. Me imagino que te refieres a system.io.dll.

Saludos,

Patrick

# la visión de un ingeniero de campo said on Tuesday, November 13, 2007 5:13 PM

Durante el análisis de Microsoft.VisualBasic.dll tuve problemas para poder ver los contadores de rendimiento

# veronica said on Monday, November 19, 2007 2:27 PM

holaaaaaaa¿¿¿¿¿????? primero q nada este programa no me gusta tiene q tener algo mas importante en el campo de la estadistica!!!!!!!!!!!!!!!!!!!!!!!!

POR FAVOR ANTES DE CREAR UNA PAGINA PIENSEN EN EL FUTURO DE LOS DEMAS OK¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿!!!!!!!!!!!!!!!!

# pmackay said on Monday, November 19, 2007 3:00 PM

mmm, creo no entender a qué te refieres...¿puedes ser más precisa?....

Saludos,

Patrick

# Juan Carlos Mendoza said on Thursday, December 06, 2007 2:02 AM

Muy buen articulo, explicito y bien elaborado. Me gustaria leer otros articulos suyos.

Saludos,

# Epunamun said on Thursday, December 06, 2007 8:22 AM

Hay que ver como le va a IIS 7, creo que se el premio gordo se lo lleva MS, si mantiene estabilidad y mejoras en la configuración amigable, creoq eu se viene fuerte IIS 7.

salu2 nos bites ;-)

# pmackay said on Thursday, December 06, 2007 8:34 AM

comparto...aunque Apache repuntó bastante el último mes...claramente no se va a definir en un par de meses como yo había vaticinado....

Saludos

# pmackay said on Thursday, December 06, 2007 8:34 AM

muchas gracias.

Casi todo lo escrito está aquí en este blog. Tengo que mover unas cosas de mtj.net acá..

Saludos,

# la visión de un ingeniero de campo said on Saturday, December 08, 2007 3:37 PM

¿Qué sucede si uno no se siente bien?; en condiciones normales, uno visita al doctor para saber qué sucede

# chava said on Tuesday, December 11, 2007 7:04 PM

hola!

yo tambien tengo un problema con pantallas  azules en una lap, yo tengo el windows vista basic, y despues de un tiempo que compre el equipo me empezaron aparecer las pantallas azules, estas no son frecuentes, pueden pasar dias o semanas, y como son en ingles y no tarda mucho pues no he podido leelos completamente, dice algo asi como: drivers y otras cosas mas, no soy muy experto en esto, mas bien, nada. me he dado cuenta que esto pasa solo cuando me conecto a internet y con una red, bueno esa es mi conclusion, por que en la escuela nunca me a pasado y siempre estoy conectado, es posible que sea la configuracion de internet? puede afectar algun hardware con el tiempo o es debido a un dterioro de uno de ellos?

# pmackay said on Tuesday, December 11, 2007 9:51 PM

Hola Chava,

si pudieses tomar una foto de la pantalla podria ayudar. Podrias probar presionando el boton de pausa. Si mal no recuerdo ese boton pausa cuando se está realizando el booteo así que podría ser útil en ese caso.

La otra opción es configurar el sistema para que tome un dump de la memoria cuando falle. En vista no se donde se hace pero en XP se hace en:

Panel de control->System->Advanced->StartUpAndRecovery->SystemFailure.

Me imagino que vista tiene alguna pantalla similar para eso.

Teniendo un dump o una foto, podemos encontrar más pistas.

Saludos,

Patrick

si ocurre

# Epunamun said on Wednesday, December 12, 2007 11:56 AM

Excelente esperando la segunda Parte, Patrick te debo los monitoreos XD...

# la visión de un ingeniero de campo said on Sunday, December 16, 2007 10:15 PM

Continuando con los signos vitales de un servidor, hoy día veremos en la segunda parte, el procesador

# Rodrigo Jara said on Tuesday, December 18, 2007 7:27 PM

Excelete post y mejor analisis.

Una de las cosas que me sorprende, es la habilidad de esta herramienta que usas, Debugging Tool For Windows, al parecer tiene mucho que decir de nuestras aplicaciones, voy a tratar de ver como lograstes que te entregase toda esa informacion..

Otra cosa, me extraño que no incluyeses una cuarta conclusion respecto de no utilizar DataSet (jeje)

Saludos,

Rodrigo

# pmackay said on Tuesday, December 18, 2007 8:28 PM

jajaja...así es.... primero, muchas gracias por las felicitaciones.

debugging tools + sos es impresionante. No necesitas nada más para saber la verdad de las cosas..

y sí, podría haber colocado un par más, pero cuando haces análisis te debes guíar por la información objetiva.

El que yo deteste los datasets por los motivos que tu sabes, no hará que la aplicación tenga estos problemas :)

Saludos y siempre un gusto tenerlo por aquí. ¿cuándo lo veremos escribiendo?

Patrick.

# AL52848 said on Thursday, December 27, 2007 5:05 PM

HOLA HE TENIDO LA INQUIETUD DE  IMPLEMENTAR UN SISTEMA DE VISION PERO ME HAN MENCIONADO QUE LA LLAMADA A LIBRERIAS DLL ME SERIAN MUY UTILES PERO PARA SER SINCERO SOY UN PRINCIPIANTE EN EL AREA DE VISUAL BASIC NO SE SI PODRIAS AYUDARME CON ESA DUDA, COMO LLAMAR A DLL CON VISUAL BASIC

# pmackay said on Thursday, December 27, 2007 8:22 PM

AL52848,

por supuesto que puedo ayudarte. Necesito eso si que seas más específico en cómo quieres que sea. ¿Qué andas buscando?

Saludos,

Patrick

# A-ha » Blog Archive » Internet Explorer se cuelga por algunos segundos said on Thursday, January 10, 2008 4:09 AM

Pingback from  A-ha  &raquo; Blog Archive   &raquo; Internet Explorer se cuelga por algunos segundos

# Max said on Wednesday, January 16, 2008 8:24 AM

en el ultimo comentario respecto al codigo de dispose, indicas que al llamar a Dispose internamente tambien se llama a close (esto refiriendome a un código que se conecta a una BD).

Entonces que diferencias hay al usar close() y dispose()? o cuando usar uno de ellos o en que casos?

atte.

# pmackay said on Wednesday, January 16, 2008 1:21 PM

Max,

Excelente pregunta. Dispose en algunos casos implementados hace algo similar a close, sin embargo, no debes basarte solo en eso. Te cuento.

En la teoría (no refiriéndome a objetos de conexión a BD sino que a reglas generales), Close permite liberar algunos recursos, pero deja el objeto en un estado sobre el cual se pueden seguir ejecutando acciones como Abrir nuevamente la conexión.

Siguiendo la teoría, si se utiliza Dispose, se entiende que el objeto no será utilizado nuevamente, y cualquier llamada a algún método de este, como tratar de abrirlo nuevamente, no debiera tener éxito y una excepción debiera lanzarse.

Si te animas, en este caso hay un ejemplo de una mala implementación de Dispose en Sharepoint que lleva a problemas en Webparts de usuario. Te aviso que el post está muy denso y enredado.

msmvps.com/.../sharepoint1.aspx

Saludos,

Patrick

# Jersson on Geeks-ms said on Thursday, January 24, 2008 4:47 PM

No les ha pasado que luego de cierto tiempo notan que su IE7 comienza a ser un poco mas lento de lo acostumbrado

# SergioTarrillo's RichWeblog said on Thursday, February 21, 2008 12:28 PM

De ahora en adelante [PLEFDS = para leer el fin de semana]. Digamos que hay dos maneras de tener el c&#243;digo

# SergioTarrillo's RichWeblog said on Thursday, February 21, 2008 12:28 PM

De ahora en adelante [PLEFDS = para leer el fin de semana]. Digamos que hay dos maneras de tener el c&#243;digo

# SergioTarrillo's RichWeblog said on Thursday, February 21, 2008 12:28 PM

De ahora en adelante [PLEFDS = para leer el fin de semana]. Digamos que hay dos maneras de tener el c&#243;digo

# Claudio Perez said on Tuesday, March 18, 2008 10:21 PM

Patrick

No tengo mas que agradecer que compartas tus conocimientos. El año pasado estuve mas de 3 hrs en una maratónica charla en Microsoft sobre optimización SQL donde se trató el tema aca expuesto.

Estas últimas semana s he tenido que realizar algunas optimizaciones a algunos procedimientos almacenados en mi trabajo.

En particular logré bajar la cantidad de Reads de uno de estos SPs a un 10% de lo que ya tenía. Es decir de 2500 Reads a 250 a modo de ejemplo. Quizas a esta escala no se note tanto pero cuando hablamos de bajar de 50 mil Reads a 5 mil o de 100 mil a 10 mil las mejorría se nota sobre todo cuando se tiene una enorme concurrencia como es en nuestro caso.

Bueno como conseguí esto?

primero recordando la teoria sobre los indices cluster y no cluster y luego dandole un vistazo a las característcas de la tabla en especial sus indices.

Un indice tenia al campo 1, 2 y 3 y el join utilizaba el campo 1 y 3. Bastó agregar al join el campo 2 y tuvo un excelente efecto.

Que efectos tuvo? Se elimnó el Index Scan en el join de estas tablas y apareció un Index Seek.

Es impresionante como un pequeño ajuste puede producir mejoras importantes en el plan de ejecución de una consulta.

Ahora no hago las consultas a ciegas, sino que le doy un vistazo a las características de las tablas y utilizar las "herramientas" que tiene disponibles para darle un manito al motor de base de datos.

Bueno espero no aburrir, pero filo ya me explayé :).

Un abrazo Patrick

Claudio Perez O.

# la visión de un ingeniero de campo said on Thursday, March 20, 2008 4:30 PM

Sorpresas te llevas en la vida, siempre. A pesar de lo que parezca, hoy no ando sermoneador ni nada por

# .net y algo mas said on Sunday, March 23, 2008 2:58 PM

Todo acerca de Inline, beside, behind, Web Site Project y Web Application Project. De ahora en adelante

# .net y algo mas said on Sunday, March 23, 2008 2:59 PM

Todo acerca de Inline, beside, behind, Web Site Project y Web Application Project. De ahora en adelante

# .net y algo mas said on Sunday, March 23, 2008 2:59 PM

Todo acerca de Inline, beside, behind, Web Site Project y Web Application Project. De ahora en adelante

# Fer said on Tuesday, March 25, 2008 1:01 PM

Gracias, muy útil y bien explicado, mi servidor te lo agradece ;)

Saludos.

# pmackay said on Tuesday, March 25, 2008 2:09 PM

Muchas gracias....

¿estaban con problemas de mucho uso de memoria?

Saludos,

Patrick.

# Diego Armando gomez said on Wednesday, April 16, 2008 9:28 AM

Como estan.

Super adecuada la explicacion. Sobre todo que la ejecucion del GC se da en algun momento del tiempo no determinado, y que este libera las porciones de memoria que no estan referenciadas por ningun objeto de algun contexto. ( lo que se hace al hacer un objeto igual a nothing.)

Pero tengo una pregunta:

Para las entidades de negocio que transportan valores entre capas (un Entity), se justifica el desgaste para el programador de ponerlas a implemetar IDisposable?

Quedo atento a sus comentarios, Gracias.

# Mike Villegas said on Wednesday, April 16, 2008 12:25 PM

Tengo una aplicacion en silvelight en el cual creo diferentes controles, traté de liberar memoria eliminando los objetos, no se veia la memoria lierada en el IE7, hasta que usé el GC.Collect().

# pmackay said on Wednesday, April 16, 2008 5:49 PM

Diego,

si las entidades tienen solo tipos básicos, entendiendose como básico tipos como strings, ints, booleans, etc., no es necesario y sería una perdida de tiempo. Preguntate lo siguiente. Si la entidad implementara Dispose, ¿qué liberarías cuando alguien llame a dispose?

Por otra parte, si tu entidad tiene algun campo que sea un dataset o un stream, debieras implementar IDisposable, y en el método dispose, llamar al dispose del dataset y al close del stream.

Saludos,

Patrick

# pmackay said on Wednesday, April 16, 2008 5:51 PM

Mike,

eso es esperado. Revisa este post y conversemos.

msmvps.com/.../post0b.aspx

Saludos,

Patrick

# Sandra said on Friday, April 18, 2008 7:17 AM

Muy bien explicado el artículo, me ha aclarado muchas cosas.

# pmackay said on Sunday, April 20, 2008 8:16 AM

Muchas gracias :)

# Julio said on Monday, April 28, 2008 2:59 PM

Buena tarde, tengo una aplicación que se desarollo en v.0, luego fue mirgada a 6.0, y actualmente esta montada en un servidor de terminal server y mas de 100 usuarios se conectan atravez deeste servidor, pero se esta presentado el inconveniente que én cualquier momento y cualquier usuario, llena la memoria del servidor y bloquea el funcionamiento de los demás que puedo hacer, que se debe ??

gracias, pueden escribir a compujab@hotmail.com

# Diego C. said on Monday, May 26, 2008 3:51 PM

Primero que nada, felicitaciones por tan excelente post.

Ahora, te comento: soy algo nuevo en esto de tracear info de procesos, obtener dumps, analizarlos y demás y tengo la imperiosa necesidad de llevar a cabo estas acciones en una aplicación web de la cual participo del desarrollo.

Me bajé e instalé el Debugging Tools for Windows, pero no logro llegar al nivel de detalle que vos mostras acá.

Solo me attacheo al WP de ASPNET y me tira una chorrera de información que en realidad mucho no me dice (o no se interpretarlo correctamente, lo cual tambien es muy probable =P).

De verdad me seria muy útil lograr "ver" de alguna forma si me están quedando colgados en algún lado objetos de algún tipo, ya que, si bien los WP no están ni a la mitad de los 500Mb que mencionas para considerarlos "sospechosos"... la gente de tecnología del cliente nos reclama el alto consumo de memoria de estos.

Sin más, te saludo muy atentamente.

Diego Cañizares, BSAS, Argentina

# pmackay said on Monday, May 26, 2008 10:45 PM

Diego,

déjame tu correo utilizando el formulario de contacto (msmvps.com/.../contact.aspx).

Saludos,

Patrick

# andrea said on Thursday, May 29, 2008 6:12 PM

Hola:mi problema es que desde mi laptop ( y no desde otras pc) no puedo acceder a mi cuenta de hotmail o yahoo, ya que luego de poner la contrasenia aparece un mensaje de error: HTTP 400 LA PAGINA WEB NO PUEDE SER ENCONTRADA y un candado aparece al lado de la barra de direcciones de IE.En otras ocasiones pude acceder a mi cuenta pero al clickear para leer los mails, vuelve a aparecer el mensaje de error.

Que tengo que hacer?, (es solo desde esta maquina y no sucede con otras)

Gracias por la pronta respuesta

# pmackay said on Friday, May 30, 2008 4:01 PM

Andrea,

fíjate que la fecha y hora esté correcta en tu equipo.

Saludos,

# Christian G said on Friday, May 30, 2008 4:10 PM

Hola Patrick

Es la primera ves que leo tu Blog, me agradan los contenidos

Yo Uso varios So por diversas razones, y al igual que vos,opino que todos tienen problemas.

Que uno sea mas estable que otro, Ok, Mas Usable, Tambien.

Pero para poder entender esto, solo hay que hacerse algnas preguntas

Cuantos usuarios usan Linux y cuantos Windows ?

Porque ?

En Que Sector esta enfocado uno y otro ?

Cual es mas usable.?

y aqui seria un largo etcetera

Es como cuando te piden una solucion de desarrollo de sistema.

En mi caso, como profesional, para que le voy brindar una solucion n-capas a una empresa que lo unico que quiere es ver el stock en la web ?

Se entiende ?  

CG

# andrea said on Saturday, May 31, 2008 4:26 PM

PMACKAY: SI, LA FECHA Y HORA ESTAN CORRECTAS.lO LLAMATIVO ES QUE ESTO EMPEZÓ A SUCEDER LUEGO QUE ME INSTALARAN EL MODEM.aNTES NO TENÍA PROBLEMAS, AUNQUE EN LA COMPANIA QUE ME LO INSTALO DICEN QUE NO TIENE NADA QUE VER CON ELLOS, Y QUE PODRIA SER UN TEMA DEL EXPLORADOR, POR LO QUE ME SUGIRIERON HACERLO CON MOZILLA.tAMPOCO SE SOLUCIONO EL PROBLEMA.

sIGO A LA ESPERA DE AYUDA!!!!!!gRACIAS

# Marcelo said on Thursday, June 12, 2008 5:53 PM

Muy buena la explicación, generalmente me encuentro con personas que consultan acerca de este tipo de escenarios, la mayoria opta por el famoso restart.

saludos cordiales.

# Alex said on Friday, June 27, 2008 9:55 AM

Buenas, muy buen trabajo debugando el proceso!

Una cosa que puede que te dé alguna pista más. El error de SWorkingProccess normalmente está asociado a cuando un usuario cierra el navegador cuando todavía no ha acabado de generarse la página y está renderizando con el buffer activado. Es imposible evitarlo, pero se puede llegar a liberar la memoria si cazas la excepción dentro del global.asax.

No sé si te habré ayudado o confundido! Un saludo

# Alex said on Friday, June 27, 2008 9:57 AM

Perdona, antes he puesto IISWorkingProccess cuando quería decir ISAPIWorkerRequestInProcForIIS6

# Variable not found en Geeks.ms said on Monday, July 07, 2008 2:34 PM

Mucho se ha hablado (por ejemplo aquí , aquí , aquí , aquí ...) acerca de lo terrible que puede resultar

# Martin said on Thursday, July 10, 2008 9:42 AM

Excelente artículo, Muchas Gracias por la explicación.

Saludos.

# Sam said on Thursday, July 17, 2008 8:13 AM

Excelente, hace un tiempo me paso eso, pero usando javascript, que lamentablemente no tiene no stringbuilder. Excelente el blog. hoy lo descubri, y aprendi mucho. Muchas Gracias!

# elmago24 said on Monday, July 21, 2008 11:13 AM

Es impresionante este blog de alto contenido técnico, el 90% de las cosas no las entiendo pero aún asi me parece un trabajo bastante interesante, al autor del blog solo comentarle cual fue su formación técnica para tener los conocimientos q tiene sobre el analisis de aplicaciones? Enhorabuena por el blog!!

# pmackay said on Monday, July 21, 2008 6:00 PM

Hola,

gracias por tus palabras. Si tuviese que definir cual ha sido uno de los mejores libros que te pueden ayudar a realizar este trabajo, elegiría "Windows Internals" de Mark Russinovich y David Solomon.

Entender el funcionamiento de Windows es la base para el resto. IIS, SQL, ASP, ASPNET y otros productos usan las funcionalidades que el sistema operativo expone.

Para este caso en especial, está involucrado el memory manager de windows, y ojo que no significa que funcione mal, pero entendiendo como funciona la memoria en windows, sabes adonde apuntar cuando estás buscando los soluciones para las aplicaciones con problemas.

Hay otros libros muy útiles también, pero lo mas importante es entender "el ambiente" (el sistema operativo) donde corren las aplicaciones.

Saludos

Patrick

# elmago24 said on Tuesday, July 22, 2008 10:45 AM

Supongo que sera fundamental como dices y que te habrán hecho falta conocimientos muy sólidos de sistemas operativos para poder ver como funciona todo el tinglado.

Como sugerencia te animo a que en alguna ocasión y ya que esta tan de moda el J2EE y Java escribas algun post con algún análisis sobre rendimiento y monitoreo de las aplicaciones en la JVM.

Un saludo desde España y felicitaciones de nuevo por el blog, francamente interesante.

# santiago el toro de la costa antartica said on Wednesday, July 30, 2008 12:21 AM

vos sos un groso mal... buscando ver si tenia q poner vista64 si o si para poder ponerle 4gb a mi makina nueva cai aca... y no podia creer q alguien sepa tanto jajja

sos un capo maN!!!

felicitaciones...

kiero q seas mi tio jajaja

# Adrián Faúndez said on Wednesday, July 30, 2008 8:52 AM

Felicitaciones!, recién me he topado con tu página. buscando sobre memoria del Kernel he llegado hasta aquí. La verdad es que fue solo por intrusear.

No se si tu me puedes ayudar con un problema que tengo con el Window Vista Home Premium.

No he podido instalar el Easy PHP, me dice que el puerto esta ocupado por otro servidor, se refiere a que no me permite cargar el apache. He realizado varios revisiones como asociar el EsayPHP al Firewall, tengo dudas si Norton me esta objetando..El IIS esta desactivado y no se que mas hacer...¡Auxilio!

Ahora en el semestre que viene me van a dar duro con PHP MySQL..

Saludos,

Adrián Faúndez

# pmackay said on Wednesday, July 30, 2008 10:55 PM

Adrián,

¿por qué PHP necesitaría un puerto?. Nunca lo he instalado, pero no veo la relación entre un lenguage de programación y un puerto. Apache es quién debiera "tomarse" algunos puertos.

Lograste hacer que Apache funcione como servidor web?, que al menos sirva contenido estático?

Veamos primero que el servidor funcione...

Saludos,

# Richarth said on Tuesday, August 05, 2008 11:26 PM

Hola , tu conclusion sobre las estadisticas esta muy buena , me ayudaron mucho a entender el proceso que sigue sql con respecto a las estadisticas, me gustaria saber como se puede revisar el log de transacciones de sql , para averiguar datos acerca de los datos de una tabla especifica , quien modifico , cuando a que hora , cual era el valor antes de la modificacion etc.  

de antemano te doy las gracias por tu ayuda

Richarth

Lima-Peru

# pmackay said on Friday, August 08, 2008 10:34 PM

Richarth,

si necesitas saber esa información, puedes activar el modo de auditabilidad C2.

Más info en

technet.microsoft.com/.../ms189114.aspx

saludos,

Patrick

# NareYuli said on Thursday, August 28, 2008 7:56 AM

Hola.

Sigo tu blog interesantisimo!! La realidad es que por mi trabajo , y por mi gran interes por este tema de analizar los dump de los procesos , tengo suma necesidad de saber como analizarlos.

Hoy por hoy en mi trabajo ( administrador del IIS )tengo problemas con una aplicacion que se cuelga y llegue al punto de tener que analizar si o si , ya que si no los programadores y yo , no tenemos mas que tocar.

Estoy usando el debugdiag 1.1 , me tira un analisis que no tengo manera de justificarlo ya que no entiendo bien el porque de ese analisis.

No encuentro informacion que me ayude a como empezar de cero a comprenderlos y analizarlos.

Si podes brindarme informacion como lograrlo realmente te lo agradeceria.

Desde ya muchas gracias.

# pmackay said on Thursday, August 28, 2008 2:34 PM

Sergio,

Lamentablemente la pregunta que me haces no es fácil de responder. Si tu estas en cero, es bastante el camino que tienes que recorrer. Para nada imposible, pero si es extenso.

Hay tipos de problemas que requieren saber más y otros menos. Por ejemplo, aplicaciones con 100% de uso de CPU son las más simples de resolver. Un par de dumps, debugdiag o windbg y listo.

Aplicaciones con consumo de memoria elevado, si es código manejado, no debiera ser difícil, pero para código no manejado, es considerablemente más difícil, y requiere seguir una serie de pasos para poder hacer troubleshooting. Debugdiag puede ser tan útil como inútil en este caso.

Finalmente, crash o hangs, ufff, es todo un mundo. Si tienes el reporte de debug diag, mándamelo para verlo y avanzamos.

Si realmente quieres aprender de esto y estás dispuesto a invertir una cantidad interesante de tiempo (un par de años en mi caso), te recomiendo comenzar con el libro Windows Internals de Rusinovich y Solomon. Una vez que se tiene la base de cómo funciona Windows, el análisis de dumps se simplifica bastante porque aprendes a interpretar muchas cosas y descartar otras que sabes que son "normales".

Sin querer desanimarte, si tus expectativas son aprender a hacer esto en 1 mes, es una ambición utópica.

Saludos,

Patrick

# Ruben said on Thursday, September 04, 2008 5:23 AM

Buenas,

Me ha encantado el artículo, una vez estuve buscando información sobre este mismo tema y desgraciadamente no te encontré, hoy me lo han pasado y me ha abierto el apetito; ¿Podrías pasarme algún enlace con mas información sobre este tema? Yo buscaré también por mi cuenta pero quizás tengas algo que valga la pena por ahí... ;)

Un saludo y muchas gracias.

# pmackay said on Saturday, September 06, 2008 9:45 AM

Ruben,

estos links tienen una explicación de cómo funciona el garbage collector y otro sobre cómo implementar dispose correctamente.

msdn.microsoft.com/.../bb985010(en-us).aspx

msdn.microsoft.com/.../bb985011(en-us).aspx

www.bluebytesoftware.com/.../PermaLink.aspx

Te comento que este último está para leerlo bien despierto. No lo dejes como lectura de noche..... aunque realmente los otros dos tampoco....

Saludos,

Patrick

# Phoenix said on Friday, September 12, 2008 1:29 PM

Un articulo genial, gracias por la explicación :-D !!

# carlos said on Thursday, September 18, 2008 6:25 PM

Hola que tal esta muy interesante esta algoritmo y me interesa bastante ya que estoy trabajando con tranferir algunos datos incriptados te agradeceris si me pudieras mandar el codigo para desencriptar a mi correo grax!!! eerm_15@hotmail.com

# pmackay said on Thursday, September 18, 2008 10:48 PM

Carlos,

todo lo que necesitas está publicado en este post, con más información y ejemplos para copiar.

msmvps.com/.../post28.aspx

Saludos,

Patrick

# WALTER said on Tuesday, September 23, 2008 2:52 PM

Me parece excelente, lo voy a probar. Pienso que es muy útil para aplicaciones que todavía no se han migrado a .NET y que se necesita que sean rápidas.

# pmackay said on Wednesday, September 24, 2008 6:04 PM

Walter,

cuéntame como te fue con las pruebas. No tengo registros de que alguien lo haya usado más allá de pruebas experimentales. La información que proveas será muy valiosa.

Saludos,

Patrick.

# Carlos Damián said on Friday, October 10, 2008 2:41 PM

Patrick,

Realmente, un artículo muy práctico. Se agradece el código fuente.

Una duda que me queda, el vector de inicialización ¿lo debe implementar uno mismo o se deja a cargo del algoritmo?

# pmackay said on Friday, October 10, 2008 2:52 PM

Carlos,

muchas gracias. Puedes dejar que lo cree internamente. Así podemos estar seguros de que posee la entropía necesaria.

Saludos,

Patrick

# janette said on Thursday, October 16, 2008 9:58 AM

Buenas!.... necesito saber COMO podemos guardar el TRACE de la compilacion en nuestro disco,,,

Me dijeron q habia una configuracion en especial que hacia posible esto... desde la Web Config...

Le agradeceria su Rta.....

Gracias

# pmackay said on Thursday, October 16, 2008 7:45 PM

Janette,

no tengo conocimientos que haya alguna forma de hacerlo en asp.net. Creo eso sí, que utilizando ETW podrías lograrlo. te dejo algunos links de utilidad:

msdn.microsoft.com/.../cc163437.aspx

www.microsoft.com/.../594174a1-f8d4-4338-a996-9c171e7bc3a2.mspx

www.microsoft.com/.../4a6b8c2b-2752-487f-b049-b5b1bce1f715.mspx

Saludos

# Matias Acuña Precht said on Thursday, October 23, 2008 9:04 AM

hola!

Yo ultimamente he tenido un problema

con un notebook Hp con windows vista

No es muy seguido el pantallazo azul,

.Mas que nada este NB trabaja con aplicaciones

utilitarias, word, excel, etc, a lo mas trabaja

un autocad sobre el, pero nada mas complejo en relacion a aplicaciones.

Si me pudieses echar una mano te lo agradeceria mucho.

De antemano Gracias

Deje mi mail en respuesta.

# pmackay said on Thursday, October 23, 2008 7:47 PM

Matías,

revisa en el visor de eventos de windows cual es el "stop code" de windows y el resto de información que aparece ahí y mandamela por mail utilizando el formulario de contacto de este blog.

Saludos,

Patrick

# Fernando said on Monday, November 03, 2008 1:23 AM

He probado tú código en una aplicación que estoy desarrollando, donde genero una tabla en Html que luego se mostrará en un correo electronico, y la verdad es que funciona perfectamente.

Saludos y gracias

# Gonzalo Balladares said on Sunday, November 16, 2008 10:08 PM

Para un curso que estoy preparando recurrí a este artículo como fuente de información sobre la repartición del mercado de los webservers... lo interesante es que después de 1 año, todo sigue igual, estabilizandose el market share...

# Nelson said on Wednesday, December 03, 2008 7:30 AM

Alguien podría transformar el codigo en VB.net, gracias

# pmackay said on Wednesday, December 03, 2008 4:37 PM

Nelson,

puedes compilar el proyecto y luego utilizar reflector para transformar el IL en C#. Esto debe funcionar.

Saludos,

Patrick

# Hector Rivera said on Thursday, December 11, 2008 12:01 PM

Muy bueno el articulo, muchas grs por la explicacion

# Matias Espinoza said on Friday, December 12, 2008 1:54 PM

Muy bueno este post, cuando estara la tercera entrega?

# Ivan said on Tuesday, December 16, 2008 10:50 AM

Muy buena explicación sobre la encriptación, me ha gustado para enseñarlo en una clase. Hay algun sitio donde puedo bajar el programa?.

# Ivan said on Tuesday, December 16, 2008 10:51 AM

Excelente explicación. Existe algun link donde pueda bajar este programa.

# Ivan said on Tuesday, December 16, 2008 10:51 AM

Existe algun link donde pueda bajar este programa?

# pmackay said on Tuesday, December 16, 2008 8:13 PM

Ivan,

al inicio del post está un link con acceso al código fuente.

Saludos

Patrick

# Iván said on Saturday, January 03, 2009 1:10 PM

Muchas gracias por el articulo. Aunque llevo tiempo programando a nivel profesional en C++ y Java, aún soy novato con .net y he caído en el error de leer donde no debía.

Tenía un problema de memoria con un programa que estoy realizando y realmente usar GC.Collect no ha resultado ser una buena opción, mi proceso comenzaba a consumir memoria, poco a poco, hasta colapsar el sistema. Uno de los errores que comentí parece ser que no liberé bien los recursoso de un socket y por otro lado el trabajo con XML de forma integrá no resultó ser tampoco muy recomendable así que lo he sustituido por listas de XmlElemnts que luego he limpiado a mando como tu recomiendas.

Tras esto, eliminé el uso del GC.Collect y de momento se ha estabilizado en unos 14,76 Mb. Antes sobrepasaba los 200 Mb antes de caer.

Lo dicho muchas gracias y habrá que tener cuidado con lo que dejamos en mandos del GC.

# pmackay said on Saturday, January 03, 2009 7:42 PM

excelentes palabras. Lo mejor que se puede hacer con el garbage collector es dejarlo trabajar tranquilo.... y preocuparse de liberar los recursos no administrados.....

Saludos y gracias por tus palabras

# Modo debug y realese | hilpers said on Sunday, January 18, 2009 5:37 AM

Pingback from  Modo debug y realese | hilpers

# Forzar el borrado de un objeto de memoria | hilpers said on Sunday, January 18, 2009 5:40 AM

Pingback from  Forzar el borrado de un objeto de memoria | hilpers

# Fabiola Mauro said on Thursday, February 12, 2009 10:07 AM

Hola, excelente articulo. Como me linkeo a la parte I que mencionas en este articulo?

# Fabiola Mauro said on Thursday, February 12, 2009 10:08 AM

Disculpa ya encontre el link en la pagina...Gracias

# Fabiola Mauro said on Thursday, February 12, 2009 10:26 AM

Buen articulo tambien, pero me gustaria saber en que momento se debe considerar crear las estadisticas o nuevas estadisticas, si no esta la creacion de manera automatica? Puede incluirse en un plan de mantenimiento semanal?

Gracias...

# pmackay said on Thursday, February 12, 2009 5:05 PM

Fabiola,

la respuesta depende de cuantos datos se consideren en el muestreo. Si se opta por tomar el 100% de los datos y la tabla es grande, tenlo por seguro que eso tomará tiempo e impactará el servicio que está entregando el servidor.

Generalmente se hace en un plan de mantención similar al con que se reconstruyen o defragmentan los índices.

Saludos,

Patrick

# rudrom said on Thursday, February 19, 2009 12:54 PM

Genial, desde su publicación hace dos años, este artículo continua estando vigente al másimo.

Gracias a él, un novato como yo, he podido concretar por qué se partía mi programa con Native error 0xc0000005.

Es una función que graba los datos de un form en la .sdf, tanto el form lo cerraba con close() y llamaba a otra instancia limpia, la conexión la cerraba tras grabar los datos también con close() tras unos minutos de uso partía sin razón aparente.

GRACIAS EN MAYÚSCULAS

# la visión de un ingeniero de campo said on Monday, February 23, 2009 4:42 PM

Hace ya un tiempo publiqué un post donde hablaba de liberación de memoria en código

# yeiko said on Wednesday, February 25, 2009 9:13 PM

esta buenísimo....

# Rafael said on Thursday, March 26, 2009 11:56 PM

hola saludos,

me interesaria saber mas acerca de los temas de mirar el rendimiento de los servidores  a nivel de procesador disco y ram. debido a que en eso se basa mi tesis.

Almenos saber de donde se basan para hacer estos analisis y todo eso.

me seria de mucha ayuda la bibliografia

de antemano gracias por la ayuda

mi email es rafael4121@hotmail.com

# Bull said on Thursday, April 02, 2009 10:04 AM

He llegado aquí de casualidad, buscando info sobre estadísticas de SQL Server.

Coincido en que es un buen artículo. Felicidades chaval.

Y no sería mala idea que pusieras el link al artículo primero.

# pmackay said on Sunday, April 05, 2009 10:03 AM

Bull, el link está en el segundo párrafo :)

# Felipe said on Monday, April 06, 2009 2:32 PM

pmackay:

Primero darte las gracias por esto, ya q no toda la gente se da el tiempo para explicar con tanta buena voluntad.

te cuento... tengo una aplicacion en .net con c# y la parte grafica esta implementada en flash, estamos ademas cargando .mht en webbrowser, el problema mas grande es que llamando al metodo dispose y asignando null a los objetos, solo consigo bajarle al uso de memoria, pero el uso de la memoria virtual sube, sube y no para de subir hasta que se cae el programa. e usado detodo, hasta el GC.collect() y solo consigo bajarle lo comentado... la memoria virtual se me escapa...

espero una ayudita de tu parte...

de antemano muchas gracias.

Felipe B.

# pmackay said on Monday, April 06, 2009 9:56 PM

Felipe,

si estás utilizando componentes no manejados (com), después de usarlos, debes liberar el RCW utilizando Marshal.ReleaseComObject(objeto)

dotnetdebug.net/.../marshalreleasecomobject-and-cpu-spinning

Otra cosa que se me ocurre es preguntarte si estan usando consutlas con ado.net, con cursores del lado del cliente?

Saludos

# Felipe said on Tuesday, April 07, 2009 8:48 AM

MIRA AUN NO UTILIZO Marshal.ReleaseComObject(objeto) PARA HACER PRUEBAS PERO RESPECTO A TU PREGUNTA TE PUEDO COMENTAR QUE EL PROYECTO ES LOCAL (PC AUTOSERVICIO PARA IMPRIMIR INFORMACION QUE ESTA DENTRO DEL PROYECTO EN FORMATO .MHT), Y AL REALIZARLO SIN IMPLEMENTAR FLASH, NO EXISTE NINGUN PROBLEMA, EL PROBLEMA ES FLASH.

SALUDOS

# Felipe said on Tuesday, April 07, 2009 12:12 PM

hola.

e estado todos estos dias haciendo pruebas y mi conclusion es q el objeto axShockwaveFlash de flash cada vez que lo llamo de una pagina a otra se aloja en la memoria virtual y el uso de memoria casi a la par y utilizando el close, dispose gc.collect() no baja nada... estoy tratando de utilizar Marshal.ReleaseComObject(objeto) y nose si lo estoy utilizando mal o que, pero no logro bajarle a la virtual y al parecer no estoy eliminado el objeto.

me tiene preocupado este tema.

espero puedas ayudarme y gracias otra vez.

saludos

# pmackay said on Wednesday, April 08, 2009 9:03 AM

mmmm, en estos casos, te recomiendo bajar la ultima versión del componente que estas usando.....

si el problema persiste, ver en los foros de Adobe.... con un poco de suerte, podría estar ahí la respuesta (o al menos el consuelo de que no eres el único)...

Finalmente, si te animas a tomar un dump de la memoria del proceso, puedo revisarlo y ver si hay algo por ahí......

saludos...

# Felipe said on Thursday, April 09, 2009 8:34 AM

Solo queria contarte que consegui solucionarlo... el metodo para solucionarlo es el siguiente,el problema es q el flash genera los controles de los botones cada vez que se crea un form... la forma era no crear el new objeto flash, sino que pasar los controles por parametros... eso.

saludos y gracias.

# pmackay said on Thursday, April 09, 2009 5:21 PM

gracias por la información....

Patrick

# Sebastian Lagos said on Monday, April 27, 2009 12:07 PM

Hola, quise descargar el material pero hay un error en la pagina

me lo pueden enviar al siguiente mail: slagos@assist.com.uy ??

muchas gracias!