summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristopher Ferris <cferris@google.com>2014-04-15 21:20:10 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2014-04-15 21:20:11 +0000
commit64e71a7c2efb5783744335e8df45e5da152a65da (patch)
tree94f7b5580a5886072118e4db2bed4901e82808f6
parent0f4575dbbd6587023229c87bcd385557a96830ae (diff)
parent17224d57fbc690051fbfecdc95140ead21305ba3 (diff)
downloadsystem_core-64e71a7c2efb5783744335e8df45e5da152a65da.zip
system_core-64e71a7c2efb5783744335e8df45e5da152a65da.tar.gz
system_core-64e71a7c2efb5783744335e8df45e5da152a65da.tar.bz2
Merge "Avoid logging functions from signal handler."
-rwxr-xr-xlibbacktrace/UnwindCurrent.cpp20
-rw-r--r--libbacktrace/UnwindCurrent.h2
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);