FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
cppcheck/cli/stacktrace.cpp at main · juneman/cppcheck · GitHub
juneman
/
cppcheck
Public
forked from
cppcheck-opensource/cppcheck
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Pull requests
0
Actions
Projects
Security and quality
0
Insights
Additional navigation options
Code
Pull requests
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
cppcheck
/
cli
/
stacktrace.cpp
Copy path
More file actions
More file actions
Latest commit
History
History
History
96 lines (90 loc) · 4.25 KB
Breadcrumbs
cppcheck
/
cli
/
stacktrace.cpp
Copy path
File metadata and controls
96 lines (90 loc) · 4.25 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/*
* Cppcheck - A tool for static C/C++ code analysis
* Copyright (C) 2007-2022 Cppcheck team.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#
include
"
stacktrace.h
"
#
ifdef
USE_UNIX_BACKTRACE_SUPPORT
#
include
"
utils.h
"
#
include
<
algorithm
>
#
include
<
cstdlib
>
#
include
<
cstring
>
#
include
<
cxxabi.h
>
#
include
<
execinfo.h
>
void
print_stacktrace
(
FILE
* output,
bool
demangling,
int
maxdepth,
bool
lowMem)
{
//
32 vs. 64bit
#
define
ADDRESSDISPLAYLENGTH
((
sizeof
(
long
)==
8
)?
12
:
8
)
const
int
fd =
fileno
(output);
void
*callstackArray[
32
]= {
nullptr
};
//
the less resources the better...
const
int
currentdepth =
backtrace
(callstackArray, (
int
)
getArrayLength
(callstackArray));
const
int
offset=
2
;
//
some entries on top are within our own exception handling code or libc
if
(maxdepth<
0
)
maxdepth=currentdepth-offset;
else
maxdepth =
std::min
(maxdepth, currentdepth);
if
(lowMem) {
fputs
(
"
Callstack (symbols only):
\n
"
, output);
backtrace_symbols_fd
(callstackArray+offset, maxdepth, fd);
}
else
{
char
**symbolStringList =
backtrace_symbols
(callstackArray, currentdepth);
if
(symbolStringList) {
fputs
(
"
Callstack:
\n
"
, output);
char
demangle_buffer[
2048
]= {
0
};
for
(
int
i = offset; i < maxdepth; ++i) {
const
char
*
const
symbolString = symbolStringList[i];
char
* realnameString =
nullptr
;
const
char
*
const
firstBracketName =
strchr
(symbolString,
'
(
'
);
const
char
*
const
firstBracketAddress =
strchr
(symbolString,
'
[
'
);
const
char
*
const
secondBracketAddress =
strchr
(firstBracketAddress,
'
]
'
);
const
char
*
const
beginAddress = firstBracketAddress+
3
;
const
int
addressLen =
int
(secondBracketAddress-beginAddress);
const
int
padLen =
int
(
ADDRESSDISPLAYLENGTH
-addressLen);
if
(demangling && firstBracketName) {
const
char
*
const
plus =
strchr
(firstBracketName,
'
+
'
);
if
(plus && (plus>(firstBracketName+
1
))) {
char
input_buffer[
1024
]= {
0
};
strncpy
(input_buffer, firstBracketName+
1
, plus-firstBracketName-
1
);
size_t
length =
getArrayLength
(demangle_buffer);
int
status=
0
;
//
We're violating the specification - passing stack address instead of malloc'ed heap.
//
Benefit is that no further heap is required, while there is sufficient stack...
realnameString =
abi::__cxa_demangle
(input_buffer, demangle_buffer, &length, &status);
//
non-NULL on success
}
}
const
int
ordinal=i-offset;
fprintf
(output,
"
#%-2d 0x
"
,
ordinal);
if
(padLen>
0
)
fprintf
(output,
"
%0*d
"
,
padLen,
0
);
if
(realnameString) {
fprintf
(output,
"
%.*s in %s
\n
"
,
(
int
)(secondBracketAddress-firstBracketAddress-
3
), firstBracketAddress+
3
,
realnameString);
}
else
{
fprintf
(output,
"
%.*s in %.*s
\n
"
,
(
int
)(secondBracketAddress-firstBracketAddress-
3
), firstBracketAddress+
3
,
(
int
)(firstBracketAddress-symbolString), symbolString);
}
}
free
(symbolStringList);
}
else
{
fputs
(
"
Callstack could not be obtained
\n
"
, output);
}
}
#
undef
ADDRESSDISPLAYLENGTH
}
#
endif
//
USE_UNIX_BACKTRACE_SUPPORT
Back
|
FazBrowse Home
|
New Git URL