c++oding="utf-8" ?>
pretty_function 获取完整函数签名;c++filt 离线反混淆;node-cxxfilt 用于 node.js;abi::__cxa_demangle 支持运行时解码;dwarf 调试信息提取原始函数名。

一、使用 __PRETTY_FUNCTION__ 获取原始函数签名
__PRETTY_FUNCTION__ 是 GCC 和 Clang 编译器广泛支持的扩展标识符,它在编译时展开为包含返回类型、参数列表、类作用域及 const/volatile 限定符的完整函数声明字符串,适用于调试与日志中需精确识别函数上下文的场景。
1、在目标函数内部直接引用 __PRETTY_FUNCTION__ 宏。
2、将其作为 const char* 类型字符串传入日志函数或 std::cout 输出。
3、注意该值在不同编译器中格式存在差异:GCC 输出类似 "int A::foo(int) const",Clang 可能附加模板实例化细节或命名空间前缀。
二、调用 c++filt 命令行工具反混淆符号名
c++filt 是 GNU Binutils 提供的标准反混淆工具,专用于将链接器可见的 mangled 符号(如 _ZNK3MapixEj)还原为人类可读的原始函数声明,无需运行时开销,适合离线分析崩溃堆栈或 nm/objdump 输出。
1、在终端中执行 c++filt _ZNK3MapixEj,其中下划线开头的字符串为待解码的修饰名。
2、添加 -p 参数启用“解析模式”,使输出更贴近源码风格(例如省略隐式 this 指针标记)。
3、若处理批量符号,可将修饰名列表写入文件,通过管道传递:cat symbols.txt | c++filt。
三、集成 node-cxxfilt 在 Node.js 环境中反混淆
node-cxxfilt 是面向 JavaScript 生态的轻量级封装库,允许在构建流程、错误监控前端或 CI 日志解析脚本中直接调用 C++ 符号反混淆能力,屏蔽底层 c++filt 二进制依赖和平台差异。
1、通过 npm 安装:npm install node-cxxfilt。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
2、在 JS 文件中引入并调用:const { demangle } = require('node-cxxfilt'); console.log(demangle('_Z3addii'));。
3、支持同步与异步接口,异步版本自动 fallback 到子进程调用系统 c++filt,确保兼容性。
四、使用 abi::__cxa_demangle 进行运行时反混淆
abi::__cxa_demangle 是 libstdc++ 提供的 C 风格 ABI 接口,可在程序运行期间动态解码 mangled 名,适用于捕获异常时打印调用栈、自定义 assert 处理器等需实时获取可读函数名的场合。
1、包含头文件:#include
2、分配足够缓冲区并调用函数:int status; char* unmangled = abi::__cxa_demangle(mangled, nullptr, nullptr, &status);。
3、检查 status 返回值:0 表示成功,-1 表示无效符号,-2 表示内存不足,-3 表示内部错误;成功后需手动 free(unmangled)。
五、从调试信息(DWARF)提取未修饰函数名
当目标二进制启用了调试信息(-g),可通过 readelf 或 llvm-dwarfdump 工具直接读取 DWARF 调试段中的 DW_TAG_subprogram 条目,其 DW_AT_name 属性即为原始函数名,不依赖名称修饰规则,也不受编译器扩展限制。
1、使用命令:readelf -wi your_binary | grep -A5 "DW_TAG_subprogram"。
2、定位 DW_AT_name 属性行,其后紧跟的字符串即为源码中定义的函数名。
3、若需结构化解析,可用 Python + pyelftools 库遍历 DIE(Debugging Information Entry),提取 DW_AT_name 和 DW_AT_decl_line 字段联合定位。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










