void f_debug_print_backtrace() { if (RuntimeOption::InjectedStackTrace) { Array bt = FrameInjection::GetBacktrace(true); int i = 0; for (ArrayIter it = bt.begin(); !it.end(); it.next(), i++) { Array frame = it.second().toArray(); StringBuffer buf; buf.append('#'); buf.append(i); if (i < 10) buf.append(' '); buf.append(' '); if (frame.exists("class")) { buf.append(frame->get("class").toString()); buf.append(frame->get("type").toString()); } buf.append(frame->get("function").toString()); buf.append("()"); if (frame.exists("file")) { buf.append(" called at ["); buf.append(frame->get("file").toString()); buf.append(':'); buf.append(frame->get("line").toString()); buf.append(']'); } buf.append('\n'); echo(buf.detach()); } } else { StackTrace st; echo(String(st.toString())); } }
String debug_string_backtrace(bool skip) { if (RuntimeOption::InjectedStackTrace) { Array bt; StringBuffer buf; bt = g_vmContext->debugBacktrace(skip); int i = 0; for (ArrayIter it = bt.begin(); !it.end(); it.next(), i++) { Array frame = it.second().toArray(); buf.append('#'); buf.append(i); if (i < 10) buf.append(' '); buf.append(' '); if (frame.exists(s_class)) { buf.append(frame->get(s_class).toString()); buf.append(frame->get(s_type).toString()); } buf.append(frame->get(s_function).toString()); buf.append("()"); if (frame.exists(s_file)) { buf.append(" called at ["); buf.append(frame->get(s_file).toString()); buf.append(':'); buf.append(frame->get(s_line).toString()); buf.append(']'); } buf.append('\n'); } return buf.detach(); } else { StackTrace st; return String(st.toString()); } }
void StructuredLogEntry::setStackTrace(folly::StringPiece key, const StackTrace& st) { std::vector<folly::StringPiece> stackFrames; folly::split("\n", st.toString(), stackFrames); for (auto& frame : stackFrames) { const char* p = frame.begin(); while (*p == '#' || *p == ' ' || (*p >= '0' && *p <= '9')) ++p; frame = folly::StringPiece(p, frame.end()); } setVec(key, stackFrames); }
String debug_string_backtrace(bool skip, bool ignore_args /* = false */, int limit /* = 0 */) { if (RuntimeOption::InjectedStackTrace) { Array bt; StringBuffer buf; bt = g_context->debugBacktrace(skip, false, false, nullptr, ignore_args, limit); int i = 0; for (ArrayIter it = bt.begin(); !it.end(); it.next(), i++) { Array frame = it.second().toArray(); buf.append('#'); buf.append(i); if (i < 10) buf.append(' '); buf.append(' '); if (frame.exists(s_class)) { buf.append(frame->get(s_class).toString()); buf.append(frame->get(s_type).toString()); } buf.append(frame->get(s_function).toString()); buf.append("("); if (!ignore_args) { bool first = true; for (ArrayIter it = frame->get(s_args).begin(); !it.end(); it.next()) { if (!first) { buf.append(", "); } else { first = false; } try { buf.append(it.second().toString()); } catch (FatalErrorException& fe) { buf.append(fe.getMessage()); } } } buf.append(")"); if (frame.exists(s_file)) { buf.append(" called at ["); buf.append(frame->get(s_file).toString()); buf.append(':'); buf.append(frame->get(s_line).toString()); buf.append(']'); } buf.append('\n'); } return buf.detach(); } else { StackTrace st; return String(st.toString()); } }
std::string libmaus2::util::StackTrace::getStackTrace(bool translate) { StackTrace st; return st.toString(translate); }