2012-01-27 7 views
5

¿Cómo puedo encontrar el tamaño máximo de pila actual de subprocesos?¿Cómo encontrar el tamaño máximo de pila actual de subprocesos en .net?

Recibo una excepción de desbordamiento de la pila al ejecutar una función desde la interfaz de usuario de MMC pero no desde Powershell (línea de comando/consola). Así que estoy adivinando que tiene algo que ver con el tamaño de pila predeterminado asignado en el hilo de UI al de Powershell (línea de comando/consola).

Entonces, ¿cómo encontrar el tamaño máximo de pila actual del hilo?

Sé que idealmente no es necesario conocerlos o configurarlos, pero parece que está relacionado con el tamaño de la pila, ya que funciona desde console/powershell (aplicación de línea de comandos) no desde la interfaz de usuario.

Notas (por debajo del hilo es una especie de relación pero, duerma responde a mi pregunta, probablemente, da algunas pautas..)

Maximum Thread Stack Size .NET?

Para obtener más deails sobre el problema real:

StackOverFlowException: Is it programming error (recursion) or not enough maximum default stack size?

Respuesta

2

Obteniendo esta información es realmente un PITA en realidad:

  1. obtener el ID del hilo usando GetCurrentThreadId
  2. Uso OpenThread a obtener un identificador para el hilo
  3. Ahora usa NtQueryInformationThread para obtener información sobre el hilo. Utilizará ThreadBasicInformation como THREADINFOCLASS para obtener una estructura THREAD_BASIC_INFORMATION. Ahora tiene el parámetro TebBaseAddress que es la dirección del Thread Environment Block.
  4. Leer en la memoria del proceso en la dirección TebBaseAddress.
  5. En el Thread Environment Block (TEB), tiene acceso a la propiedad StackLimit que es el valor que está buscando.

Desde el paso 3, no está documentado. Es por eso que no recomiendo recuperar esta información.

1

Desde Windows 8, existe la función GetCurrentThreadStackLimits(). Se puede utilizar desde C# a través de PInvoke así:

[DllImport("kernel32.dll")] 
static extern void GetCurrentThreadStackLimits(out uint lowLimit, out uint highLimit); 

uint low; 
uint high; 

GetCurrentThreadStackLimits(out low, out high); 
var size = (high - low)/1024; // in KB 

En mi máquina, esto produce 1 MB en una aplicación de consola, 256KB en una aplicación web (IIS).

Cuestiones relacionadas