symbolize.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include "backtrace.h"
  2. #include "symbolizer.h"
  3. #include <util/string/split.h>
  4. #include <util/stream/str.h>
  5. namespace NYql {
  6. namespace NBacktrace {
  7. TString Symbolize(const TString& input, const THashMap<TString, TString>& mapping) {
  8. #if defined(__linux__) && defined(__x86_64__)
  9. TString output;
  10. TStringOutput out(output);
  11. i64 stackSize = -1;
  12. TVector<TStackFrame> frames;
  13. TVector<TString> usedFilenames;
  14. for (TStringBuf line: StringSplitter(input).SplitByString("\n")) {
  15. if (line.StartsWith("StackFrames:")) {
  16. TVector<TString> parts;
  17. Split(TString(line), " ", parts);
  18. if (parts.size() > 1) {
  19. TryFromString<i64>(parts[1], stackSize);
  20. frames.reserve(stackSize);
  21. }
  22. } else if (line.StartsWith("StackFrame:")) {
  23. TVector<TString> parts;
  24. Split(TString(line), " ", parts);
  25. TString modulePath;
  26. ui64 address;
  27. ui64 offset;
  28. if (parts.size() > 3) {
  29. modulePath = parts[1];
  30. TryFromString<ui64>(parts[2], address);
  31. TryFromString<ui64>(parts[3], offset);
  32. auto it = mapping.find(modulePath);
  33. if (it != mapping.end()) {
  34. modulePath = it->second;
  35. }
  36. usedFilenames.emplace_back(std::move(modulePath));
  37. frames.emplace_back(TStackFrame{usedFilenames.back().c_str(), address - offset});
  38. }
  39. } else {
  40. out << line << "\n";
  41. }
  42. }
  43. if (stackSize == 0) {
  44. out << "Empty stack trace\n";
  45. }
  46. Symbolize(frames.data(), frames.size(), &out);
  47. return output;
  48. #else
  49. Y_UNUSED(mapping);
  50. return input;
  51. #endif
  52. }
  53. } /* namespace NBacktrace */
  54. } /* namespace NYql */