diff options
author | Christopher Ferris <cferris@google.com> | 2014-04-15 21:20:10 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-04-15 21:20:11 +0000 |
commit | 64e71a7c2efb5783744335e8df45e5da152a65da (patch) | |
tree | 94f7b5580a5886072118e4db2bed4901e82808f6 | |
parent | 0f4575dbbd6587023229c87bcd385557a96830ae (diff) | |
parent | 17224d57fbc690051fbfecdc95140ead21305ba3 (diff) | |
download | system_core-64e71a7c2efb5783744335e8df45e5da152a65da.zip system_core-64e71a7c2efb5783744335e8df45e5da152a65da.tar.gz system_core-64e71a7c2efb5783744335e8df45e5da152a65da.tar.bz2 |
Merge "Avoid logging functions from signal handler."
-rwxr-xr-x | libbacktrace/UnwindCurrent.cpp | 20 | ||||
-rw-r--r-- | libbacktrace/UnwindCurrent.h | 2 |
2 files changed, 14 insertions, 8 deletions
diff --git a/libbacktrace/UnwindCurrent.cpp b/libbacktrace/UnwindCurrent.cpp index 034b73c..67d372a 100755 --- a/libbacktrace/UnwindCurrent.cpp +++ b/libbacktrace/UnwindCurrent.cpp @@ -42,7 +42,7 @@ bool UnwindCurrent::Unwind(size_t num_ignore_frames) { BACK_LOGW("unw_getcontext failed %d", ret); return false; } - return UnwindFromContext(num_ignore_frames, true); + return UnwindFromContext(num_ignore_frames, false); } std::string UnwindCurrent::GetFunctionNameRaw(uintptr_t pc, uintptr_t* offset) { @@ -57,12 +57,14 @@ std::string UnwindCurrent::GetFunctionNameRaw(uintptr_t pc, uintptr_t* offset) { return ""; } -bool UnwindCurrent::UnwindFromContext(size_t num_ignore_frames, bool resolve) { +bool UnwindCurrent::UnwindFromContext(size_t num_ignore_frames, bool within_handler) { // The cursor structure is pretty large, do not put it on the stack. unw_cursor_t* cursor = new unw_cursor_t; int ret = unw_init_local(cursor, &context_); if (ret < 0) { - BACK_LOGW("unw_init_local failed %d", ret); + if (!within_handler) { + BACK_LOGW("unw_init_local failed %d", ret); + } delete cursor; return false; } @@ -74,13 +76,17 @@ bool UnwindCurrent::UnwindFromContext(size_t num_ignore_frames, bool resolve) { unw_word_t pc; ret = unw_get_reg(cursor, UNW_REG_IP, &pc); if (ret < 0) { - BACK_LOGW("Failed to read IP %d", ret); + if (!within_handler) { + BACK_LOGW("Failed to read IP %d", ret); + } break; } unw_word_t sp; ret = unw_get_reg(cursor, UNW_REG_SP, &sp); if (ret < 0) { - BACK_LOGW("Failed to read SP %d", ret); + if (!within_handler) { + BACK_LOGW("Failed to read SP %d", ret); + } break; } @@ -98,7 +104,7 @@ bool UnwindCurrent::UnwindFromContext(size_t num_ignore_frames, bool resolve) { prev->stack_size = frame->sp - prev->sp; } - if (resolve) { + if (!within_handler) { frame->func_name = GetFunctionName(frame->pc, &frame->func_offset); frame->map = FindMap(frame->pc); } else { @@ -154,7 +160,7 @@ UnwindThread::~UnwindThread() { void UnwindThread::ThreadUnwind( siginfo_t* /*siginfo*/, void* sigcontext, size_t num_ignore_frames) { ExtractContext(sigcontext); - UnwindFromContext(num_ignore_frames, false); + UnwindFromContext(num_ignore_frames, true); } //------------------------------------------------------------------------- diff --git a/libbacktrace/UnwindCurrent.h b/libbacktrace/UnwindCurrent.h index acce110..41080c7 100644 --- a/libbacktrace/UnwindCurrent.h +++ b/libbacktrace/UnwindCurrent.h @@ -34,7 +34,7 @@ public: virtual std::string GetFunctionNameRaw(uintptr_t pc, uintptr_t* offset); - bool UnwindFromContext(size_t num_ignore_frames, bool resolve); + bool UnwindFromContext(size_t num_ignore_frames, bool within_handler); void ExtractContext(void* sigcontext); |