Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Native code - how to get function call stack (backtrace) programmatically

Tags:

I have C++ codebase running on Android, and want to have crash reports sent by users.

I'm using ACRA library which works fine for Java code, but when something crashes in native code, I don't get enough information. Actually I'd like to receive stack trace of native function calls. I know crash info is printed into logcat after my process ends, and I can configure ACRA to read/send logcat. I've setup my code to detect native crash using signal handlers and calling back to Java for reporting by ACRA. It works also fine.

However there's bad timing with this approach - ACRA reads logs while crashing process is still alive, and Android (don't know exactly which part) writes crash report to logcat after crashed process completely ends. So I don't receive stack traces when using ACRA.

So I'm looking for a way to programatically read current stack trace from C++ code, and feed this info to ACRA (or maybe other crash reporting tool) myself.

All I need is some kind of this report written to logcat:

10-10 08:29:13.868: INFO/DEBUG(1121):          #00  pc 0003fc7c  /data/data/com.ex.lib/libapp.so 10-10 08:29:13.891: INFO/DEBUG(1121):          #04  pc 00016df4  /system/lib/libdvm.so 10-10 08:29:13.891: INFO/DEBUG(1121):          #05  pc 00045284  /system/lib/libdvm.so 10-10 08:29:13.899: INFO/DEBUG(1121):          #15  pc 00047c56  /system/lib/libdvm.so 10-10 08:29:13.922: INFO/DEBUG(1121):          #16  pc 00030e4c  /system/lib/libandroid_runtime.so 

Is there any way to get this stack trace from my code?

like image 528
Pointer Null Avatar asked Oct 10 '11 08:10

Pointer Null


People also ask

How function calls are stored in stack?

Function call stack in C is a dynamic data structure where elements are stored at contiguous memory locations. Function call stack is maintained for every function call where it contains its own local variables and parameters of the callee function.

Can stack be used for function calls?

The function call stack (often referred to just as the call stack or the stack) is responsible for maintaining the local variables and parameters during function execution.

How do you call a stack in Python?

If you use python debugger, not only interactive probing of variables but you can get the call stack with the "where" command or "w".


1 Answers

I have done this in my game base project - you can see the JNI code which handles this here:

https://bitbucket.org/xg/android-game-base/src/c0d969d44a55/jni/NativeActivityJNI.cpp#cl-40

which calls the Java method defined here:

https://bitbucket.org/xg/android-game-base/src/c0d969d44a55/src/com/gmail/whittock/tom/Util/NativeActivity.java#cl-91

The overall solution is based on handling signals, then in the signal handler firing a call up to java to dump the stack trace etc, in my code I start another activity to get the logcat information and email it to me.

like image 175
Tom Whittock Avatar answered Sep 28 '22 00:09

Tom Whittock