Index: src/platform-openbsd.cc |
diff --git a/src/platform-openbsd.cc b/src/platform-openbsd.cc |
index 4f5420ee45c97e5ede7ee0cde34118f1aac7c947..30a484f4b30b83a6fc0c9e281955d0ead0fd405d 100644 |
--- a/src/platform-openbsd.cc |
+++ b/src/platform-openbsd.cc |
@@ -231,6 +231,34 @@ void OS::SignalCodeMovingGC() { |
} |
+int OS::StackWalk(Vector<OS::StackFrame> frames) { |
+ // backtrace is a glibc extension. |
+ int frames_size = frames.length(); |
+ ScopedVector<void*> addresses(frames_size); |
+ |
+ int frames_count = backtrace(addresses.start(), frames_size); |
+ |
+ char** symbols = backtrace_symbols(addresses.start(), frames_count); |
+ if (symbols == NULL) { |
+ return kStackWalkError; |
+ } |
+ |
+ for (int i = 0; i < frames_count; i++) { |
+ frames[i].address = addresses[i]; |
+ // Format a text representation of the frame based on the information |
+ // available. |
+ SNPrintF(MutableCStrVector(frames[i].text, kStackWalkMaxTextLen), |
+ "%s", |
+ symbols[i]); |
+ // Make sure line termination is in place. |
+ frames[i].text[kStackWalkMaxTextLen - 1] = '\0'; |
+ } |
+ |
+ free(symbols); |
+ |
+ return frames_count; |
+} |
+ |
// Constants used for mmap. |
static const int kMmapFd = -1; |