Avoid logging functions from signal handler.

Change-Id: Ic61f7054ced223631f95efb519fa1825fb3e1010
This commit is contained in:
Christopher Ferris 2014-04-11 13:05:07 -07:00
parent 391224c807
commit 9007677fcb
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);
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);
}
//-------------------------------------------------------------------------

View file

@ -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);