commit
70f0f55813
@ -282,7 +282,7 @@ void TestLogging(bool check_counts) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void NoAllocNewHook() {
|
static void NoAllocNewHook() {
|
||||||
CHECK(false) << "unexpected new";
|
LOG(FATAL) << "unexpected new";
|
||||||
}
|
}
|
||||||
|
|
||||||
struct NewHook {
|
struct NewHook {
|
||||||
|
|||||||
@ -93,16 +93,23 @@ static void **NextStackFrame(void **old_sp) {
|
|||||||
// If you change this function, also change GetStackFrames below.
|
// If you change this function, also change GetStackFrames below.
|
||||||
int GetStackTrace(void** result, int max_depth, int skip_count) {
|
int GetStackTrace(void** result, int max_depth, int skip_count) {
|
||||||
void **sp;
|
void **sp;
|
||||||
#ifdef __i386__
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#if __GNUC__ * 100 + __GNUC_MINOR__ >= 402
|
||||||
|
#define USE_BUILTIN_FRAME_ADDRESS
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_BUILTIN_FRAME_ADDRESS
|
||||||
|
sp = reinterpret_cast<void**>(__builtin_frame_address(0));
|
||||||
|
#elif defined(__i386__)
|
||||||
// Stack frame format:
|
// Stack frame format:
|
||||||
// sp[0] pointer to previous frame
|
// sp[0] pointer to previous frame
|
||||||
// sp[1] caller address
|
// sp[1] caller address
|
||||||
// sp[2] first argument
|
// sp[2] first argument
|
||||||
// ...
|
// ...
|
||||||
sp = (void **)&result - 2;
|
sp = (void **)&result - 2;
|
||||||
#endif
|
#elif defined(__x86_64__)
|
||||||
|
|
||||||
#ifdef __x86_64__
|
|
||||||
// __builtin_frame_address(0) can return the wrong address on gcc-4.1.0-k8
|
// __builtin_frame_address(0) can return the wrong address on gcc-4.1.0-k8
|
||||||
unsigned long rbp;
|
unsigned long rbp;
|
||||||
// Move the value of the register %rbp into the local variable rbp.
|
// Move the value of the register %rbp into the local variable rbp.
|
||||||
|
|||||||
@ -99,7 +99,13 @@ TEST(Symbolize, Symbolize) {
|
|||||||
|
|
||||||
// Compilers should give us pointers to them.
|
// Compilers should give us pointers to them.
|
||||||
EXPECT_STREQ("nonstatic_func", TrySymbolize((void *)(&nonstatic_func)));
|
EXPECT_STREQ("nonstatic_func", TrySymbolize((void *)(&nonstatic_func)));
|
||||||
EXPECT_STREQ("static_func", TrySymbolize((void *)(&static_func)));
|
|
||||||
|
// The name of an internal linkage symbol is not specified; allow either a
|
||||||
|
// mangled or an unmangled name here.
|
||||||
|
const char *static_func_symbol = TrySymbolize((void *)(&static_func));
|
||||||
|
CHECK(NULL != static_func_symbol);
|
||||||
|
EXPECT_TRUE(strcmp("static_func", static_func_symbol) == 0 ||
|
||||||
|
strcmp("static_func()", static_func_symbol) == 0);
|
||||||
|
|
||||||
EXPECT_TRUE(NULL == TrySymbolize(NULL));
|
EXPECT_TRUE(NULL == TrySymbolize(NULL));
|
||||||
}
|
}
|
||||||
@ -254,8 +260,13 @@ static const char *SymbolizeStackConsumption(void *pc, int *stack_consumed) {
|
|||||||
return g_symbolize_result;
|
return g_symbolize_result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __ppc64__
|
||||||
|
// Symbolize stack consumption should be within 4kB.
|
||||||
|
const int kStackConsumptionUpperLimit = 4096;
|
||||||
|
#else
|
||||||
// Symbolize stack consumption should be within 2kB.
|
// Symbolize stack consumption should be within 2kB.
|
||||||
const int kStackConsumptionUpperLimit = 2048;
|
const int kStackConsumptionUpperLimit = 2048;
|
||||||
|
#endif
|
||||||
|
|
||||||
TEST(Symbolize, SymbolizeStackConsumption) {
|
TEST(Symbolize, SymbolizeStackConsumption) {
|
||||||
int stack_consumed;
|
int stack_consumed;
|
||||||
@ -267,9 +278,13 @@ TEST(Symbolize, SymbolizeStackConsumption) {
|
|||||||
EXPECT_GT(stack_consumed, 0);
|
EXPECT_GT(stack_consumed, 0);
|
||||||
EXPECT_LT(stack_consumed, kStackConsumptionUpperLimit);
|
EXPECT_LT(stack_consumed, kStackConsumptionUpperLimit);
|
||||||
|
|
||||||
|
// The name of an internal linkage symbol is not specified; allow either a
|
||||||
|
// mangled or an unmangled name here.
|
||||||
symbol = SymbolizeStackConsumption((void *)(&static_func),
|
symbol = SymbolizeStackConsumption((void *)(&static_func),
|
||||||
&stack_consumed);
|
&stack_consumed);
|
||||||
EXPECT_STREQ("static_func", symbol);
|
CHECK(NULL != symbol);
|
||||||
|
EXPECT_TRUE(strcmp("static_func", symbol) == 0 ||
|
||||||
|
strcmp("static_func()", symbol) == 0);
|
||||||
EXPECT_GT(stack_consumed, 0);
|
EXPECT_GT(stack_consumed, 0);
|
||||||
EXPECT_LT(stack_consumed, kStackConsumptionUpperLimit);
|
EXPECT_LT(stack_consumed, kStackConsumptionUpperLimit);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -349,4 +349,12 @@ _END_GOOGLE_NAMESPACE_
|
|||||||
// Make an implementation of stacktrace compiled.
|
// Make an implementation of stacktrace compiled.
|
||||||
#ifdef STACKTRACE_H
|
#ifdef STACKTRACE_H
|
||||||
# include STACKTRACE_H
|
# include STACKTRACE_H
|
||||||
|
# if 0
|
||||||
|
// For include scanners which can't handle macro expansions.
|
||||||
|
# include "stacktrace_libunwind-inl.h"
|
||||||
|
# include "stacktrace_x86-inl.h"
|
||||||
|
# include "stacktrace_x86_64-inl.h"
|
||||||
|
# include "stacktrace_powerpc-inl.h"
|
||||||
|
# include "stacktrace_generic-inl.h"
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -39,7 +39,9 @@
|
|||||||
#elif defined(__CYGWIN__) || defined(__CYGWIN32__)
|
#elif defined(__CYGWIN__) || defined(__CYGWIN32__)
|
||||||
# define OS_CYGWIN
|
# define OS_CYGWIN
|
||||||
#elif defined(linux) || defined(__linux) || defined(__linux__)
|
#elif defined(linux) || defined(__linux) || defined(__linux__)
|
||||||
# define OS_LINUX
|
# ifndef OS_LINUX
|
||||||
|
# define OS_LINUX
|
||||||
|
# endif
|
||||||
#elif defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)
|
#elif defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)
|
||||||
# define OS_MACOSX
|
# define OS_MACOSX
|
||||||
#elif defined(__FreeBSD__)
|
#elif defined(__FreeBSD__)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user