x86 stacktrace: Use __builtin_frame_address if possible
This commit is contained in:
parent
0d78884a22
commit
f278d734c1
@ -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.
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user