| 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;
|
|
|