2020-12-26 14:12:05 -08:00
|
|
|
// Copyright (c) FIRST and other WPILib contributors.
|
|
|
|
|
// Open Source Software; you can modify and/or share it under the terms of
|
|
|
|
|
// the WPILib BSD license file in the root directory of this project.
|
2019-08-12 23:45:45 -07:00
|
|
|
|
|
|
|
|
#include "wpi/StackTrace.h"
|
|
|
|
|
|
|
|
|
|
#include <execinfo.h>
|
|
|
|
|
|
|
|
|
|
#include "wpi/Demangle.h"
|
|
|
|
|
#include "wpi/SmallString.h"
|
2020-01-10 23:41:40 -08:00
|
|
|
#include "wpi/StringRef.h"
|
2019-08-12 23:45:45 -07:00
|
|
|
#include "wpi/raw_ostream.h"
|
|
|
|
|
|
|
|
|
|
namespace wpi {
|
|
|
|
|
|
|
|
|
|
std::string GetStackTrace(int offset) {
|
|
|
|
|
void* stackTrace[128];
|
|
|
|
|
int stackSize = backtrace(stackTrace, 128);
|
|
|
|
|
char** mangledSymbols = backtrace_symbols(stackTrace, stackSize);
|
|
|
|
|
wpi::SmallString<1024> buf;
|
|
|
|
|
wpi::raw_svector_ostream trace(buf);
|
|
|
|
|
|
|
|
|
|
for (int i = offset; i < stackSize; i++) {
|
|
|
|
|
// Only print recursive functions once in a row.
|
|
|
|
|
if (i == 0 || stackTrace[i] != stackTrace[i - 1]) {
|
2020-01-10 23:41:40 -08:00
|
|
|
// extract just function name from "pathToExe(functionName+offset)"
|
|
|
|
|
StringRef sym{mangledSymbols[i]};
|
|
|
|
|
sym = sym.split('(').second;
|
|
|
|
|
sym = sym.split('+').first;
|
|
|
|
|
trace << "\tat " << Demangle(sym) << "\n";
|
2019-08-12 23:45:45 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::free(mangledSymbols);
|
|
|
|
|
|
|
|
|
|
return trace.str();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace wpi
|