Merge "Avoid logging functions from signal handler."
This commit is contained in:
commit
64e71a7c2e
2 changed files with 14 additions and 8 deletions
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue