| Index: runtime/bin/platform_android.cc
|
| diff --git a/runtime/bin/platform_android.cc b/runtime/bin/platform_android.cc
|
| index 87ee9aa715f1dcca9aa426452c6e65c3e32d07b7..2ea90778ce2388dbb5ee5e4f18347c5475312aca 100644
|
| --- a/runtime/bin/platform_android.cc
|
| +++ b/runtime/bin/platform_android.cc
|
| @@ -22,6 +22,11 @@ char* Platform::resolved_executable_name_ = NULL;
|
| int Platform::script_index_ = 1;
|
| char** Platform::argv_ = NULL;
|
|
|
| +static void segv_handler(int signal, siginfo_t* siginfo, void* context) {
|
| + Dart_DumpNativeStackTrace(context);
|
| + abort();
|
| +}
|
| +
|
| bool Platform::Initialize() {
|
| // Turn off the signal handler for SIGPIPE as it causes the process
|
| // to terminate on writing to a closed pipe. Without the signal
|
| @@ -33,6 +38,30 @@ bool Platform::Initialize() {
|
| perror("Setting signal handler failed");
|
| return false;
|
| }
|
| +
|
| + act.sa_flags = SA_SIGINFO;
|
| + act.sa_sigaction = &segv_handler;
|
| + if (sigemptyset(&act.sa_mask) != 0) {
|
| + perror("sigemptyset() failed.");
|
| + return false;
|
| + }
|
| + if (sigaddset(&act.sa_mask, SIGPROF) != 0) {
|
| + perror("sigaddset() failed");
|
| + return false;
|
| + }
|
| + if (sigaction(SIGSEGV, &act, NULL) != 0) {
|
| + perror("sigaction() failed.");
|
| + return false;
|
| + }
|
| + if (sigaction(SIGBUS, &act, NULL) != 0) {
|
| + perror("sigaction() failed.");
|
| + return false;
|
| + }
|
| + if (sigaction(SIGTRAP, &act, NULL) != 0) {
|
| + perror("sigaction() failed.");
|
| + return false;
|
| + }
|
| +
|
| return true;
|
| }
|
|
|
|
|