-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSymbolDemangler.cpp
More file actions
37 lines (31 loc) · 1.1 KB
/
Copy pathSymbolDemangler.cpp
File metadata and controls
37 lines (31 loc) · 1.1 KB
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
#include "SymbolDemangler.h"
#include <windows.h>
#include <dbghelp.h>
#include <vector>
// 指示链接器链接 Dbghelp.lib
#pragma comment(lib, "Dbghelp.lib")
std::string SymbolDemangler::demangle(const std::string& mangledName) {
// 1. 基础检查:MSVC 修饰名通常以 '?' 开头
if (mangledName.empty() || mangledName[0] != '?') {
return mangledName;
}
// 2. 准备缓冲区
// 大多数符号不会超过 4KB,但为了安全可以使用动态大小或足够大的栈空间
char buffer[4096];
memset(buffer, 0, sizeof(buffer));
// 3. 调用 Windows API 进行反修饰
// UNDNAME_COMPLETE:以此获取最完整的函数签名(包括返回类型、参数类型等)
// UNDNAME_NAME_ONLY: 如果只想获取函数名,可以使用这个标志
DWORD result = UnDecorateSymbolName(
mangledName.c_str(), // 修饰名
buffer, // 输出缓冲区
sizeof(buffer), // 缓冲区大小
UNDNAME_COMPLETE // 标志位:输出完整声明
);
// 4. 检查结果
if (result == 0) {
// 如果返回 0,表示失败(可能不是有效的修饰名),根据要求返回原始内容
return mangledName;
}
return std::string(buffer);
}