- Symbolizer symbolizer;
- folly::StringPiece symbolName;
- Dwarf::LocationInfo location;
- for (auto ip : info.frames) {
- // Symbolize the previous address because the IP might be in the
- // next function, per glog/src/signalhandler.cc
- symbolizer.symbolize(ip-1, symbolName, location);
- Symbolizer::write(out, ip, symbolName, location);
+ size_t frameCount = info.frames.size();
+ // Skip our own internal frames
+ static constexpr size_t skip = 3;
+
+ if (frameCount > skip) {
+ auto addresses = info.frames.data() + skip;
+ frameCount -= skip;
+
+ std::vector<SymbolizedFrame> frames;
+ frames.resize(frameCount);
+
+ Symbolizer symbolizer;
+ symbolizer.symbolize(addresses, frames.data(), frameCount);
+
+ OStreamSymbolizePrinter osp(out, SymbolizePrinter::COLOR_IF_TTY);
+ osp.println(addresses, frames.data(), frameCount);