Red de conocimiento informático - Material del sitio web - ¿Cómo escribir un programa de Android para llamar al seguimiento de pila?

¿Cómo escribir un programa de Android para llamar al seguimiento de pila?

Descubra los rastros de la pila de llamadas del programa, puede saber quién llamó a esta interfaz y también puede comprender rápidamente el proceso de llamada del programa, lo cual es muy práctico. Sin embargo, cabe señalar que no se puede utilizar en el código oficial y solo se puede utilizar para depurar. Consume muchos recursos y provocará una inundación de registros.

A continuación se describe cómo imprimir seguimientos de llamadas de programas en programas Android Java/C++/C. Si necesita usarlo en otros entornos, debe migrar la biblioteca sacacorchos a la parte C++/C.

Lenguaje Java (un lenguaje informático, especialmente utilizado para crear sitios web)

Es muy simple, crea un objeto Throwable y podrás obtener el seguimiento de la pila actual. El siguiente ejemplo es un rastro de cómo llamar a la función foobar():

1 foobar() privado void {

2 Throwable t = new Throwable();

3 Log .d(label, "stack trace is", t);

4 }

C++

También es relativamente simple, solo use el utilidades/clase de pila de llamadas. El archivo de encabezado se encuentra en frameworks/native/include/utils/call stack.h y se puede usar directamente sin modificar Android.mk. El siguiente ejemplo es el seguimiento de la llamada a la función Foo::bar():

.

Copiar código

1 # include & lt;utils/call stack

2

3 void Foo::bar(). {

4//pila de llamadas::pila de llamadas(const char * logtag, int32_t ignoreDepth, int32_t maxDepth)

5 pila de llamadas * t = nueva pila de llamadas(" Trace ", 1, 30) ;

6Eliminar t;

7 }

Copiar el código

C

A Un poco más problemático, necesita llamar directamente al sacacorchos/backtrace. De hecho, utils/Callstack en C++ también usa sacacorchos/backtrace, pero es más fácil de usar mediante encapsulación. Podemos referirnos al código en CallStack.cpp. El siguiente ejemplo es un seguimiento que llama a la función foobar():

Nota: C no puede llamar directamente al código C++ a menos que se agregue el contenedor C correspondiente a C++. class., o cargado dinámicamente a través de dlsym.

Copiar código

1 # incluye < sacacorchos/rastreo posterior h & gt;

2

3 pila de volcado vacío. trace(const char * logtag, int32_t ignoreDepth, int32_t maxDepth) const {

4 static const int MAX _ DEPTH = 31

5 static const int MAX _ back trace _ LINE _ LONGITUD = 800;

Seis

7 if(profundidad máxima & gt; MAX_DEPTH) {

8 maxDepth = MAX _ PROFUNDIDAD

9 }

10 seguimiento hacia atrás _ marco _ t m pila[MAX _ DEPTH]

11 ssize _ t recuento = desenrollar _ seguimiento hacia atrás (m pila, ignorarProfundidad + 1, profundidad máxima );

12 if(count & lt; = 0) {

13 LOGE("No se puede obtener el seguimiento de la pila");

14 return;

15 }

16

17 backtrace_symbol_t símbolos [recuento]

18

19 obtener _ back trace_symbols (m pila, recuento, símbolos);

20 for(size_t I = 0;i<count;i++) {

21 char LINE[MAX _ back trace _ LINE _ LENGTH];

22 formato _ backtrace _ line(I & mStack[i], & símbolo[i],

23 líneas, MAX _ back trace _ LINE _ LENGTH

24 ALOG(LOG_DEBUG, etiqueta de registro, " %s%s ",

25 "",

26 líneas

27 }

28 free_backtrace_symbols(símbolo, recuento);

29 }

30

31 void foobar() {

32 dumpStackTrace("Trace ", 1, 30);

33 }

Copiar código

El archivo de encabezado se encuentra en system/core/include/. sacacorchos/back trace.h, necesitas agregar:

1 BIBLIOTECAS _ COMPARTIDAS _ LOCAL+= libcorkscrew