Merge "Avoid logging functions from signal handler."

This commit is contained in:
Christopher Ferris 2014-04-15 21:20:10 +00:00 committed by Gerrit Code Review
commit 64e71a7c2e
2 changed files with 14 additions and 8 deletions

View file

@ -42,7 +42,7 @@ bool UnwindCurrent::Unwind(size_t num_ignore_frames) {
BACK_LOGW("unw_getcontext failed %d", ret); BACK_LOGW("unw_getcontext failed %d", ret);
return false; return false;
} }
return UnwindFromContext(num_ignore_frames, true); return UnwindFromContext(num_ignore_frames, false);
} }
std::string UnwindCurrent::GetFunctionNameRaw(uintptr_t pc, uintptr_t* offset) { 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 ""; 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. // The cursor structure is pretty large, do not put it on the stack.
unw_cursor_t* cursor = new unw_cursor_t; unw_cursor_t* cursor = new unw_cursor_t;
int ret = unw_init_local(cursor, &context_); int ret = unw_init_local(cursor, &context_);
if (ret < 0) { if (ret < 0) {
BACK_LOGW("unw_init_local failed %d", ret); if (!within_handler) {
BACK_LOGW("unw_init_local failed %d", ret);
}
delete cursor; delete cursor;
return false; return false;
} }
@ -74,13 +76,17 @@ bool UnwindCurrent::UnwindFromContext(size_t num_ignore_frames, bool resolve) {
unw_word_t pc; unw_word_t pc;
ret = unw_get_reg(cursor, UNW_REG_IP, &pc); ret = unw_get_reg(cursor, UNW_REG_IP, &pc);
if (ret < 0) { if (ret < 0) {
BACK_LOGW("Failed to read IP %d", ret); if (!within_handler) {
BACK_LOGW("Failed to read IP %d", ret);
}
break; break;
} }
unw_word_t sp; unw_word_t sp;
ret = unw_get_reg(cursor, UNW_REG_SP, &sp); ret = unw_get_reg(cursor, UNW_REG_SP, &sp);
if (ret < 0) { if (ret < 0) {
BACK_LOGW("Failed to read SP %d", ret); if (!within_handler) {
BACK_LOGW("Failed to read SP %d", ret);
}
break; break;
} }
@ -98,7 +104,7 @@ bool UnwindCurrent::UnwindFromContext(size_t num_ignore_frames, bool resolve) {
prev->stack_size = frame->sp - prev->sp; prev->stack_size = frame->sp - prev->sp;
} }
if (resolve) { if (!within_handler) {
frame->func_name = GetFunctionName(frame->pc, &frame->func_offset); frame->func_name = GetFunctionName(frame->pc, &frame->func_offset);
frame->map = FindMap(frame->pc); frame->map = FindMap(frame->pc);
} else { } else {
@ -154,7 +160,7 @@ UnwindThread::~UnwindThread() {
void UnwindThread::ThreadUnwind( void UnwindThread::ThreadUnwind(
siginfo_t* /*siginfo*/, void* sigcontext, size_t num_ignore_frames) { siginfo_t* /*siginfo*/, void* sigcontext, size_t num_ignore_frames) {
ExtractContext(sigcontext); ExtractContext(sigcontext);
UnwindFromContext(num_ignore_frames, false); UnwindFromContext(num_ignore_frames, true);
} }
//------------------------------------------------------------------------- //-------------------------------------------------------------------------

View file

@ -34,7 +34,7 @@ public:
virtual std::string GetFunctionNameRaw(uintptr_t pc, uintptr_t* offset); 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); void ExtractContext(void* sigcontext);