Error: No es posible crear una nueva página de seguridad para la pila

Iniciado por Eleкtro, 1 Agosto 2013, 15:19 PM

0 Miembros y 1 Visitante están viendo este tema.

Eleкtro

¿Alguien me puede explicar a que se debe este error?:

No es posible crear una nueva página de seguridad para la pila

Esto sucede al dejar una aplicación corriendo (en Standby digamos) durante 2 horas más o menos.

Es muy dificil buscar información sobre el problema cuando el mensaje de error está en castellano, ya que si pongo el mensaje de error en Google la única información relacionada que aparece en los resultados es esto -> Wikipedia: Pila de llamadas <-

...Después de habermelo leido, me he quedado con esta parte:
Citar
...Usualmente hay exactamente una pila de llamadas asociado a un programa en ejecución (o más precisamente, con cada tarea o hilo de un proceso)...
...Si el empujar (push) consume todo el espacio asignado para la pila de llamadas, ocurre un error llamado desbordamiento de pila...

...No entiendo muy bien las explicaciones, pero yo no uso multi-threading en mi aplicación, y todas las funciones que devuelven un valor pues...eso, lo devuelven,
y me parece que todo lo que apilo luego lo desapilo, aunque no entiendo ni se que tipo de datos son los que se apilan en una aplicación y cuales son los que puede que no se estén desapilando bien y como detectarlos.

¿Que debo examinar en mi código para intentar averiguar que puede ser el causante de este error?.

EDITO: Creo que la traducción de mi problema al inglés sería -> Stack overflow <-

EDITO 2: Las recursiones que hago en las subrutinas que uso siempre devuelven un valor es decir que su ejecución termina corréctamente (o eso creo), así que entonces esto no puede estar causando el error, ¿verdad?

Si yo tengo esto, el desapilamiento (poping) de los datos es correcto, ¿no?:

Código (vbnet) [Seleccionar]
sub loquesea(sender as object) handles algún evento cualquiera
    sender.propiedad = uno(32)
end sub

function uno(valor as int32)
   return dos(valor)
end sub

function dos(valor as int32)
   ' hacer cosas...
   return valor modificado
end function


...Es que entonces no entiendo que tipo de recursiones son las que no estoy desapilando, si en todas las subrutinas que llamo a otras subrutinas devuelvo un valor para terminar su ejecución.

EDITO 3: Me asalta la duda de cual es el tamaño máximo del Stack (la pila), y si puedo agrandar ese tamaño (mientras busco una solución decente, claro).

EDITO 4: Y también tengo la duda de si existe alguna forma para detectar recursividades conflictivas en un código, porque si tengo que modificar código y luego mantener la aplicación durante 2 horas cada vez para ver si se ha arreglado o no... vaya tela!, y además el analizador de código del VS no me indica ninguna sugerencia que corregir.








Novlucker

Cita de: EleKtro H@cker en  1 Agosto 2013, 15:19 PM
¿Alguien me puede explicar a que se debe este error?:EDITO: Creo que la traducción de mi problema al inglés sería -> Stack overflow <-

EDITO 2: Las recursiones que hago en las subrutinas que uso siempre devuelven un valor es decir que su ejecución termina corréctamente (o eso creo), así que entonces esto no puede estar causando el error, ¿verdad?

Concuerdo en que si hay un error de overflow, probablemente sea por esas rutinas recursivas, en mi caso las miraría a fondo. Y el código no me dice nada, no veo recursión ahí.

Cita de: EleKtro H@cker en  1 Agosto 2013, 15:19 PM
EDITO 3: Me asalta la duda de cual es el tamaño máximo del Stack (la pila), y si puedo agrandar ese tamaño (mientras busco una solución decente, claro).

El stack por default de un thread es de 1MB, al momento de crearlo tienes una sobrecarga para pasar el límite de manera custom.

Cita de: EleKtro H@cker en  1 Agosto 2013, 15:19 PM
EDITO 4: Y también tengo la duda de si existe alguna forma para detectar recursividades conflictivas en un código, porque si tengo que modificar código y luego mantener la aplicación durante 2 horas cada vez para ver si se ha arreglado o no... vaya tela!, y además el analizador de código del VS no me indica ninguna sugerencia que corregir.

No conozco ningún complemento que detecte esto, ya que el problema se da en tiempo de ejecución.

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Eleкtro

Gracias Novlucker

Pues nada, lo miraré a fondo todo...

Pero ...¿Y si el causante del overflow fuese algún método de alguna class de alguna dll de terceros de la cual no dispongo del source, en ese caso no habria nada que hacer al respecto, verdad? :(

PD: No sabia que habia un overload para especificar el stack del thread, pero es que de todas formas yo no estoy generando ningún nuevo thread en mi app, ¿sabrias como modificar el stack del thread principal?

Un saludo








Novlucker

¿Qué hace tu aplicación y para que utilizas métodos recursivos?
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Eleкtro

Cita de: Novlucker en  1 Agosto 2013, 20:24 PM¿Qué hace tu aplicación y para que utilizas métodos recursivos?

Tengo problemas con Windows 8 y no puedo examinar el code ahora, no es que no me apetezca contestarte xD, en cuanto pueda retomo este tema...

gracias

saludos








Eleкtro

#5
Cita de: Novlucker en  1 Agosto 2013, 20:24 PM
¿Qué hace tu aplicación y para que utilizas métodos recursivos?

He revisado el código por completo y no hay procedimiento que llame a otro, así que no se da la recursión. (y en caso de que se me haya escapado alguno estoy seguro que siempre se devuelve un valor y su ejecución termina corréctamente)

La aplicación es esta: http://foro.elhacker.net/buscador-t394060.0.html



Uso algunas dll's, sólo dos de ellas se utilizan constántemente en la aplicación, una es un usercontrol del Trackbar, y la otra es para controlar la aplicaicón Winamp,
en lugar de seguir usando esas dos dll's las he reemplazado por las classes del código fuente de las dll, y he desajuntado las dll.
he inspeccionado a los métodos que llamo de esas dos classes/dlls y tampoco hacen recursiones, bueno, en una de ellas si, pero parece que siempre devuelve el valor, aunque por otro lado el consumo de RAM no deja de subir al llamar a ese procedimiento... no sé si eso tendrá algo que ver, imagino que si el consumo de ram no deja de subir...hay algo que no está bien, aquí está el trozo de código al que me refiero:

http://foro.elhacker.net/net/fuga_de_memoria_en_una_funcion-t396259.0.html









WarZ0n3

La verdad es que no se .NET, pero al ver tu problema me intereso mucho ayudarte, mas con el tema overflows(si tuviera más tiempo claro).
Pero voy a dar un ejemplo rapido, como bien dijo novluker.
Y el problema es que la verdad muchas veces es necesario la recursividad, pero no es lo recomendable para nada, ya que es una forma fácil de quedarse sin espacio en la pila, y como esta es limitada en tamaño puede llevar a un bof... cuando tenga mas tiempo hablamos.

Eleкtro

#7
@WarZ0n3 espero impaciente tu ayuda (o la de quien sea xD)

A mi me interesa saber una cosa, para descartar opciones e intentar aislar la raiz del problema...

¿El motivo de un stackoverflow sólo puede ser la recursividad de los metodos? ¿Existen otros motivos que puedan causar un overflow de la pila?

y...bueno, vuelvo al principio, ¿Se puede aumentar el tamaño del stack del main thread?, ví que se podían usar algunos comandos de compilación para aumentar el tamaño del stack de la aplicación, pero iba escaso de tiempo y ya no tengo la información, creo que había que usar la aplicación BinEdit.exe u otra manera era especificar un parámetro "/Stack" en el compilador del framework, ¿Me podeis verificar esto?.

Saludos








Novlucker

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Eleкtro