Index: base/debug/stack_trace.h |
diff --git a/base/debug/stack_trace.h b/base/debug/stack_trace.h |
index 07e119a16b4a255dc443acf28c37d0c5cefa25c2..0344bd24c581506b73829516a35602e337d13285 100644 |
--- a/base/debug/stack_trace.h |
+++ b/base/debug/stack_trace.h |
@@ -22,6 +22,12 @@ struct _EXCEPTION_POINTERS; |
struct _CONTEXT; |
#endif |
+#if defined(OS_POSIX) && (defined(__i386__) || defined(__x86_64__)) |
+#define HAVE_TRACE_STACK_FRAME_POINTERS 1 |
+#else |
+#define HAVE_TRACE_STACK_FRAME_POINTERS 0 |
+#endif |
+ |
namespace base { |
namespace debug { |
@@ -76,6 +82,8 @@ class BASE_EXPORT StackTrace { |
// Resolves backtrace to symbols and returns as string. |
std::string ToString() const; |
+ static StackTrace FromFramePointers(size_t max_depth); |
+ |
private: |
#if defined(OS_WIN) |
void InitTrace(const _CONTEXT* context_record); |
@@ -93,6 +101,20 @@ class BASE_EXPORT StackTrace { |
size_t count_; |
}; |
+#if HAVE_TRACE_STACK_FRAME_POINTERS |
+// Traces the stack by using frame pointers. This function is faster but less |
+// reliable than StackTrace. It should work for debug and profiling builds, |
+// but not for release builds (although there are some exceptions). |
+// |
+// Writes at most |max_depth| frames (instruction pointers) into |out_trace| |
+// after skipping |skip_count| frames. Note that the function itself is not |
+// added to the trace so |skip_count| should be 0 in most cases. |
+// Returns number of frames written. |
+BASE_EXPORT size_t TraceStackFramePointers(const void** out_trace, |
+ size_t max_depth, |
+ size_t skip_count); |
bcwhite
2016/04/13 12:36:24
skip_initial?
|
+#endif // HAVE_TRACE_STACK_FRAME_POINTERS |
+ |
namespace internal { |
#if defined(OS_POSIX) && !defined(OS_ANDROID) |