Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
On Thursday, 7th July from 1 to 3 pm there will be a maintenance with a short downtime of GitLab.
Open sidebar
Simon Perkins
ducc
Commits
2a1651f8
Commit
2a1651f8
authored
Feb 24, 2020
by
Martin Reinecke
Browse files
more tweaks
parent
777181c6
Changes
2
Hide whitespace changes
Inline
Side-by-side
.gitignore
View file @
2a1651f8
...
...
@@ -69,6 +69,8 @@ coverage.xml
.ipynb_checkpoints
.libs
compile
ltmain.sh
perf.data*
config.*
configure
...
...
not_yet_integrated/stacktrace.h
0 → 100644
View file @
2a1651f8
// stacktrace.h (c) 2008, Timo Bingmann from http://idlebox.net/
// published under the WTFPL v2.0
#ifndef _STACKTRACE_H_
#define _STACKTRACE_H_
#include <stdio.h>
#include <stdlib.h>
#include <execinfo.h>
#include <cxxabi.h>
/** Print a demangled stack backtrace of the caller function to FILE* out. */
static
inline
void
print_stacktrace
(
FILE
*
out
=
stderr
,
unsigned
int
max_frames
=
63
)
{
fprintf
(
out
,
"stack trace:
\n
"
);
// storage array for stack trace address data
void
*
addrlist
[
max_frames
+
1
];
// retrieve current stack addresses
int
addrlen
=
backtrace
(
addrlist
,
sizeof
(
addrlist
)
/
sizeof
(
void
*
));
if
(
addrlen
==
0
)
{
fprintf
(
out
,
" <empty, possibly corrupt>
\n
"
);
return
;
}
// resolve addresses into strings containing "filename(function+address)",
// this array must be free()-ed
char
**
symbollist
=
backtrace_symbols
(
addrlist
,
addrlen
);
// allocate string which will be filled with the demangled function name
size_t
funcnamesize
=
256
;
char
*
funcname
=
(
char
*
)
malloc
(
funcnamesize
);
// iterate over the returned symbol lines. skip the first, it is the
// address of this function.
for
(
int
i
=
1
;
i
<
addrlen
;
i
++
)
{
char
*
begin_name
=
0
,
*
begin_offset
=
0
,
*
end_offset
=
0
;
// find parentheses and +address offset surrounding the mangled name:
// ./module(function+0x15c) [0x8048a6d]
for
(
char
*
p
=
symbollist
[
i
];
*
p
;
++
p
)
{
if
(
*
p
==
'('
)
begin_name
=
p
;
else
if
(
*
p
==
'+'
)
begin_offset
=
p
;
else
if
(
*
p
==
')'
&&
begin_offset
)
{
end_offset
=
p
;
break
;
}
}
if
(
begin_name
&&
begin_offset
&&
end_offset
&&
begin_name
<
begin_offset
)
{
*
begin_name
++
=
'\0'
;
*
begin_offset
++
=
'\0'
;
*
end_offset
=
'\0'
;
// mangled name is now in [begin_name, begin_offset) and caller
// offset in [begin_offset, end_offset). now apply
// __cxa_demangle():
int
status
;
char
*
ret
=
abi
::
__cxa_demangle
(
begin_name
,
funcname
,
&
funcnamesize
,
&
status
);
if
(
status
==
0
)
{
funcname
=
ret
;
// use possibly realloc()-ed string
fprintf
(
out
,
" %s : %s+%s
\n
"
,
symbollist
[
i
],
funcname
,
begin_offset
);
}
else
{
// demangling failed. Output function name as a C function with
// no arguments.
fprintf
(
out
,
" %s : %s()+%s
\n
"
,
symbollist
[
i
],
begin_name
,
begin_offset
);
}
}
else
{
// couldn't parse the line? print the whole line.
fprintf
(
out
,
" %s
\n
"
,
symbollist
[
i
]);
}
}
free
(
funcname
);
free
(
symbollist
);
}
#endif // _STACKTRACE_H_
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