8 #include "src/base/debug/stack_trace.h" 15 #include <src/base/platform/platform.h> 22 struct StackCrawlState {
23 StackCrawlState(
uintptr_t* frames,
size_t max_depth)
27 have_skipped_self(false) {}
32 bool have_skipped_self;
35 _Unwind_Reason_Code TraceStackFrame(_Unwind_Context* context,
void* arg) {
36 StackCrawlState* state =
static_cast<StackCrawlState*
>(arg);
40 if (ip != 0 && !state->have_skipped_self) {
41 state->have_skipped_self =
true;
42 return _URC_NO_REASON;
45 state->frames[state->frame_count++] = ip;
46 if (state->frame_count >= state->max_depth)
47 return _URC_END_OF_STACK;
48 return _URC_NO_REASON;
57 bool EnableInProcessStackDumping() {
62 struct sigaction action;
63 memset(&action, 0,
sizeof(action));
64 action.sa_handler = SIG_IGN;
65 sigemptyset(&action.sa_mask);
66 return (sigaction(SIGPIPE, &action,
nullptr) == 0);
69 void DisableSignalStackDump() {
72 StackTrace::StackTrace() {
73 StackCrawlState state(reinterpret_cast<uintptr_t*>(trace_), kMaxTraces);
74 _Unwind_Backtrace(&TraceStackFrame, &state);
75 count_ = state.frame_count;
78 void StackTrace::Print()
const {
79 std::string backtrace = ToString();
80 OS::Print(
"%s\n", backtrace.c_str());
83 void StackTrace::OutputToStream(std::ostream* os)
const {
84 for (
size_t i = 0;
i < count_; ++
i) {
85 *os <<
"#" << std::setw(2) <<
i << trace_[
i] <<
"\n";