¿Cómo escribir un programa de Android para llamar al seguimiento de pila?
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