Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
cosmicing
Prj-Cpps
提交
d00feca2
P
Prj-Cpps
项目概览
cosmicing
/
Prj-Cpps
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Prj-Cpps
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
d00feca2
编写于
1月 05, 2022
作者:
cosmicing
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add new file
上级
c04b215c
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
82 addition
and
0 deletion
+82
-0
32-Mem/backtrace.cpp
32-Mem/backtrace.cpp
+82
-0
未找到文件。
32-Mem/backtrace.cpp
0 → 100644
浏览文件 @
d00feca2
#include <cstdlib>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
// backtrace()
#include <execinfo.h>
// __cxa_demangle()
#include <cxxabi.h>
using
std
::
string
;
using
std
::
vector
;
vector
<
string
>
get_backtrace10
()
{
// backtrace()
const
int
trace_size
=
10
;
void
*
trace
[
trace_size
];
int
size
=
backtrace
(
trace
,
trace_size
);
// backtrace_symbols()
char
**
symbols
=
backtrace_symbols
(
trace
,
size
);
vector
<
string
>
result
(
symbols
,
symbols
+
size
);
free
(
symbols
);
return
result
;
}
string
cut_function_name_part
(
const
string
&
raw_text
)
{
string
::
size_type
left
=
raw_text
.
find
(
"("
);
string
::
size_type
right
=
raw_text
.
find
(
"+"
,
left
+
1
);
return
(
left
==
raw_text
.
npos
||
right
==
raw_text
.
npos
)
?
""
:
raw_text
.
substr
(
left
+
1
,
right
-
left
-
1
);
}
string
demangle_function_name
(
const
string
&
mangled
)
{
// __cxa_demangle()
int
status
=
0
;
char
*
demangled
=
abi
::
__cxa_demangle
(
mangled
.
c_str
(),
0
,
0
,
&
status
);
// demangled
string
result
=
demangled
?
demangled
:
mangled
;
free
(
demangled
);
if
(
status
!=
0
)
{
std
::
ostringstream
oss
;
oss
<<
" [error:status="
<<
status
<<
"]"
;
result
+=
oss
.
str
();
}
return
result
;
}
void
f3
()
{
vector
<
string
>
backtrace_texts
=
get_backtrace10
();
std
::
cout
<<
"Backtrace:
\n
"
;
for
(
vector
<
string
>::
const_iterator
it
=
backtrace_texts
.
begin
(),
end
=
backtrace_texts
.
end
();
it
!=
end
;
++
it
)
{
string
mangled_func_name
=
cut_function_name_part
(
*
it
);
std
::
cout
<<
((
!
mangled_func_name
.
empty
())
?
demangle_function_name
(
mangled_func_name
)
:
"???"
)
<<
": "
<<
*
it
<<
"
\n
"
;
}
}
void
f2
()
{
f3
();
}
void
f1
()
{
f2
();
}
int
main
()
{
f1
();
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录