Buffer OverFlow (code)

3 respostas
G

Gostaria de saber como desenvolvo um codigo para testar um estouro de pilha.

3 Respostas

C

ja tento colocar dentro de um try cath ?

G

Já, mas gostaria de ter um exemplo melhor, pois eu estou basendo o meu estudo em perl. Perl eu entendo um pouco, mas gostaria de um codigo em java.
grato.

H

gollum,

Para controlar o tamanho da pilha no momento de lançar a JVM, use a chave -Xss

Para controlar o tamanho da heap, use a chave -Xmx

Eis um típico comando usando as chaves acima:

java -Xmx256M -Xss1k meupacote.MinhaClasse

Observe que o valor de 1k bytes da pilha é muito baixo justamente para teste.

Para tratar estouro da pilha, use

try
{
  // código a ser monitorado
}
catch(class java.lang.StackOverflowError )
{
  // procedimento em caso de estouro
}

Procedimento semelhante ao acima não dá para capturar uma OutOfMemoryError pois neste caso a heap estará exaurida.

O truque, portanto, é evitar que ela seja toda consumida usando um código parecido com o mostrado abaixo, que só é possível com os novos recursos do Tiger:

MemoryWarningSystem mws = new MemoryWarningSystem();

  public void initMemoryWarning()
  {
    MemoryWarningSystem.setPercentageUsageThreshold(0.8);
    mws.addListener
    (
      new MemoryWarningSystem.Listener()
      {
        public void memoryUsageLow(long usedMemory, long maxMemory)
        {
          System.out.println("Memory usage low!!!");
          //
          Map<Thread,StackTraceElement[]> traces = Thread.getAllStackTraces();
          Iterator it = traces.keySet().iterator();
          while(it.hasNext())
          {
            System.out.println("------");
            StackTraceElement [] elms = traces.get(it.next());
            for(int i = 0; i < elms.length; i++)
              System.out.println(elms[i]);
          }
          //
          double percentageUsed = ((double) usedMemory) / maxMemory;
          System.out.println("percentageUsed = " + percentageUsed);
          MemoryWarningSystem.setPercentageUsageThreshold(0.8);
        }
      }
    );
  }

Observe que o valor 0.8 é equivalente a 80 porcento.

package hipersoft.util;

import javax.management.*;
import java.lang.management.*;
import java.util.*;

/**
 * This memory warning system will call the listener when we
 * exceed the percentage of available memory specified.  There
 * should only be one instance of this object created, since the
 * usage threshold can only be set to one number.
 */
public class MemoryWarningSystem
{
  private final Collection<Listener> listeners = new ArrayList<Listener>();

  public interface Listener
  {
    public void memoryUsageLow(long usedMemory, long maxMemory);
  }

  public MemoryWarningSystem()
  {
    MemoryMXBean mbean = ManagementFactory.getMemoryMXBean();
    NotificationEmitter emitter = (NotificationEmitter) mbean;
    emitter.addNotificationListener(new NotificationListener()
    {
      public void handleNotification(Notification n, Object hb)
      {
        if (n.getType().equals(MemoryNotificationInfo.MEMORY_THRESHOLD_EXCEEDED))
        {
          long maxMemory = tenuredGenPool.getUsage().getMax();
          long usedMemory = tenuredGenPool.getUsage().getUsed();
          for (Listener listener : listeners)
          {
            listener.memoryUsageLow(usedMemory, maxMemory);
          }
        }
      }
    }, null, null);
  }

  public boolean addListener(Listener listener)
  {
    return listeners.add(listener);
  }

  public boolean removeListener(Listener listener)
  {
    return listeners.remove(listener);
  }

  private static final MemoryPoolMXBean tenuredGenPool = findTenuredGenPool();

  public static void setPercentageUsageThreshold(double percentage)
  {
    if(percentage <= 0.0 || percentage > 1.0)
    {
      throw new IllegalArgumentException("Percentage not in range");
    }
    long maxMemory = tenuredGenPool.getUsage().getMax();
    long warningThreshold = (long) (maxMemory * percentage);
    tenuredGenPool.setUsageThreshold(warningThreshold);
  }

  /**
  * Tenured Space Pool can be determined by it being of type
  * HEAP and by it being possible to set the usage threshold.
  */
  private static MemoryPoolMXBean findTenuredGenPool()
  {
    for(MemoryPoolMXBean pool : ManagementFactory.getMemoryPoolMXBeans())
    {
      // I don't know whether this approach is better, or whether
      // we should rather check for the pool name "Tenured Gen"?
      if(pool.getType() == MemoryType.HEAP && pool.isUsageThresholdSupported())
      {
        return pool;
      }
    }
    throw new AssertionError("Could not find tenured space");
  }
}

Para saber mais sobre essa classe, vc poderá procurar MemoryWarningSystem no Google, por exemplo.

Criado 16 de abril de 2005
Ultima resposta 24 de abr. de 2005
Respostas 3
Participantes 3