Android StrictMode y volcado de montón
Cuando StrictMode de Android detecta una violación de objeto (por ejemplo, actividad) filtrada, sería útil que pudiera capturar un volcado de montón en ese momento. Sin embargo, no hay forma obvia de configurarlo para hacerlo. ¿Alguien sabe de algún truco que se puede utilizar para lograrlo, por ejemplo, una manera de convencer al sistema para ejecutar un código particular justo antes de la pena de muerte que se invoca? No creo que StrictMode lanza una excepción, por lo que no puedo utilizar el truco descrito aquí: ¿Existe alguna manera de que un proceso de Android produzca un volcado de montón en un OutOfMemoryError?
- Android StrictMode InstanceCountViolation
- Android Honeycomb: NetworkOnMainThreadException incluso cuando se utiliza AsyncTask y no modo estricto?
- StrictMode + Analytics
- Se ha adquirido un recurso en el rastreo de pila adjunto pero nunca se ha liberado. Consulte java.io.Closeable para obtener información sobre cómo evitar fugas de recursos
- ¿Debería tener acceso a SharedPreferences fuera del subproceso de interfaz de usuario?
- Definición de DEVELOPER_MODE para StrictMode
- StrictMode para versiones de plataforma inferiores
- Android StrictMode que publica falsos positivos
- ¿Cuál es el ciclo de vida de StrictMode de Android?
- Abrir una subactividad varias veces provoca un InstanceCountViolation a pesar de ser destruido
- Encontrar lo que violó la política de StrictMode
- Permiso de StrictModeBuilder no funciona
- Política de Android StrictMode
No excepción, pero StrictMode
imprime un mensaje a System.err
justo antes de que finaliza. Por lo tanto, se trata de un hack, pero funciona, y como sólo va a estar habilitado en las compilaciones de depuración creo que está bien … 🙂
En onCreate()
:
//monitor System.err for messages that indicate the process is about to be killed by //StrictMode and cause a heap dump when one is caught System.setErr (new HProfDumpingStderrPrintStream (System.err));
Y la clase referida a:
private static class HProfDumpingStderrPrintStream extends PrintStream { public HProfDumpingStderrPrintStream (OutputStream destination) { super (destination); } @Override public synchronized void println (String str) { super.println (str); if (str.equals ("StrictMode VmPolicy violation with POLICY_DEATH; shutting down.")) { // StrictMode is about to terminate us... don't let it! super.println ("Trapped StrictMode shutdown notice: logging heap data"); try { android.os.Debug.dumpHprofData(app.getDir ("hprof", MODE_WORLD_READABLE) + "/strictmode-death-penalty.hprof"); } catch (Exception e) { e.printStackTrace(); } } } }
(Donde app
es un campo estático en la clase externa que contiene una referencia al contexto de la aplicación, para facilitar la consulta)
La cadena que coincide ha sobrevivido sin cambios desde la liberación de jengibre hasta el jelly bean, pero podría teóricamente cambiar en futuras versiones, por lo que vale la pena comprobar las nuevas versiones para asegurarse de que todavía utilizan el mismo mensaje.