Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
f4265f7a
Commit
f4265f7a
authored
Sep 07, 2006
by
tsmith@maint1.mysql.com
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Bug #21250: esolve stack traces on AMD64 (backport to mysql-4.1)
parent
63528161
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
46 additions
and
17 deletions
+46
-17
sql/stacktrace.c
sql/stacktrace.c
+40
-15
sql/stacktrace.h
sql/stacktrace.h
+6
-2
No files found.
sql/stacktrace.c
View file @
f4265f7a
...
...
@@ -21,6 +21,7 @@
#ifdef HAVE_STACKTRACE
#include <unistd.h>
#include <strings.h>
#define PTR_SANE(p) ((p) && (char*)(p) >= heap_start && (char*)(p) <= heap_end)
...
...
@@ -44,7 +45,29 @@ void safe_print_str(const char* name, const char* val, int max_len)
}
#ifdef TARGET_OS_LINUX
#define SIGRETURN_FRAME_COUNT 2
#ifdef __i386__
#define SIGRETURN_FRAME_OFFSET 17
#endif
#ifdef __x86_64__
#define SIGRETURN_FRAME_OFFSET 23
#endif
static
my_bool
is_nptl
;
/* Check if we are using NPTL or LinuxThreads on Linux */
void
check_thread_lib
(
void
)
{
char
buf
[
5
];
#ifdef _CS_GNU_LIBPTHREAD_VERSION
confstr
(
_CS_GNU_LIBPTHREAD_VERSION
,
buf
,
sizeof
(
buf
));
is_nptl
=
!
strncasecmp
(
buf
,
"NPTL"
,
sizeof
(
buf
));
#else
is_nptl
=
0
;
#endif
}
#if defined(__alpha__) && defined(__GNUC__)
/*
...
...
@@ -90,7 +113,7 @@ inline uint32* find_prev_pc(uint32* pc, uchar** fp)
void
print_stacktrace
(
gptr
stack_bottom
,
ulong
thread_stack
)
{
uchar
**
fp
;
uint
frame_count
=
0
;
uint
frame_count
=
0
,
sigreturn_frame_count
;
#if defined(__alpha__) && defined(__GNUC__)
uint32
*
pc
;
#endif
...
...
@@ -100,28 +123,27 @@ void print_stacktrace(gptr stack_bottom, ulong thread_stack)
Attempting backtrace. You can use the following information to find out
\n
\
where mysqld died. If you see no messages after this, something went
\n
\
terribly wrong...
\n
"
);
#ifdef __i386__
#ifdef __i386__
__asm
__volatile__
(
"movl %%ebp,%0"
:
"=r"
(
fp
)
:
"r"
(
fp
));
if
(
!
fp
)
{
fprintf
(
stderr
,
"frame pointer (ebp) is NULL, did you compile with
\n
\
-fomit-frame-pointer? Aborting backtrace!
\n
"
);
return
;
}
#endif
#ifdef __x86_64__
__asm
__volatile__
(
"movq %%rbp,%0"
:
"=r"
(
fp
)
:
"r"
(
fp
));
#endif
#if defined(__alpha__) && defined(__GNUC__)
__asm
__volatile__
(
"mov $30,%0"
:
"=r"
(
fp
)
:
"r"
(
fp
));
#endif
if
(
!
fp
)
{
fprintf
(
stderr
,
"frame pointer
(fp)
is NULL, did you compile with
\n
\
fprintf
(
stderr
,
"frame pointer is NULL, did you compile with
\n
\
-fomit-frame-pointer? Aborting backtrace!
\n
"
);
return
;
}
#endif
/* __alpha__ */
if
(
!
stack_bottom
||
(
gptr
)
stack_bottom
>
(
gptr
)
&
fp
)
{
...
...
@@ -151,13 +173,16 @@ terribly wrong...\n");
:
"r"
(
pc
));
#endif
/* __alpha__ */
/* We are 1 frame above signal frame with NPTL and 2 frames above with LT */
sigreturn_frame_count
=
is_nptl
?
1
:
2
;
while
(
fp
<
(
uchar
**
)
stack_bottom
)
{
#if
def __i386__
#if
defined(__i386__) || defined(__x86_64__)
uchar
**
new_fp
=
(
uchar
**
)
*
fp
;
fprintf
(
stderr
,
"%p
\n
"
,
frame_count
==
SIGRETURN_FRAME_COUNT
?
*
(
fp
+
17
)
:
*
(
fp
+
1
));
#endif
/*
__386__
*/
fprintf
(
stderr
,
"%p
\n
"
,
frame_count
==
sigreturn_frame_count
?
*
(
fp
+
SIGRETURN_FRAME_OFFSET
)
:
*
(
fp
+
1
));
#endif
/*
defined(__386__) || defined(__x86_64__)
*/
#if defined(__alpha__) && defined(__GNUC__)
uchar
**
new_fp
=
find_prev_fp
(
pc
,
fp
);
...
...
sql/stacktrace.h
View file @
f4265f7a
...
...
@@ -19,16 +19,20 @@ extern "C" {
#endif
#ifdef TARGET_OS_LINUX
#if defined(HAVE_STACKTRACE) || (defined (__i386__) || (defined(__alpha__) && defined(__GNUC__)))
#if defined(HAVE_STACKTRACE) || (defined (__
x86_64__) || defined (__
i386__) || (defined(__alpha__) && defined(__GNUC__)))
#undef HAVE_STACKTRACE
#define HAVE_STACKTRACE
extern
char
*
__bss_start
;
extern
char
*
heap_start
;
#define init_stacktrace() { heap_start = (char*) &__bss_start; }
#define init_stacktrace() do { \
heap_start = (char*) &__bss_start; \
check_thread_lib(); \
} while(0);
void
print_stacktrace
(
gptr
stack_bottom
,
ulong
thread_stack
);
void
safe_print_str
(
const
char
*
name
,
const
char
*
val
,
int
max_len
);
void
check_thread_lib
(
void
);
#endif
/* (defined (__i386__) || (defined(__alpha__) && defined(__GNUC__))) */
#endif
/* TARGET_OS_LINUX */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment