如何识别C++编译以后的函数名

2023-10-31

C/C++语言在编译以后,函数的名字会被编译器修改,改成编译器内部的名字,这个名字会在链接的时候用到。如果用backtrace之类的函数打印堆栈时,显示的就是被编译器修改过的名字,比如说_Z3foov 。 那么这个函数真实的名字是什么呢?

每个编译器都有一套自己内部的名字,这里只是针对linux下g++而言。 以下是基本的方法: 每个方法都是以_Z开头,对于嵌套的名字(比如名字空间中的名字或者是类中间的名字,比如Class::Func)后面紧跟N , 然后是各个名字空间和类的名字,每个名字前是名字字符的长度,再以E结尾。(如果不是嵌套名字则不需要以E结尾)

比如上面的_Z3foov 就是函数foo() , v 表示参数类型为void . 又如N:C:Func 经过修饰后就是 _ZN1N1C4FuncE, 这个函数名后面跟参数类型。 如果跟一个整型,那就是_ZN1N1C4FuncEi

另外在linux下有一个工具可以实现这种转换,这个工具是c++filt , 注意不是c++filter.

xuyang@ubuntu15:~/blog$ c++filt _ZN1N1C4FuncEi
N::C::Func(int)

复制

native: #05 pc 003f0bcb /system/lib/libart.so (_ZN3art25JniMethodEndWithReferenceEP8_jobjectjPNS_6ThreadE+30)

类或命名空间中的变量或函数:

以”_ZN”开头,然后是各个空间和类的名字,每个名字前是名的字符长度,然后是变量/函数名的长度和变量/函数名,后面紧跟”E”,然后如果是函数则跟参数别名,如果是变量则什么都不用加。如上面代码中的:mangling::C1::C2::func(int i)改编后的符号是_ZN8mangling2C12C24funcEi

ZN

3art

25JniMethodEndWithReference

_EP8_jobjectjPNS_6ThreadE+30

SIGABRT的可能原因

3种可能 1、double free/free 没有初始化的地址或者错误的地址 2、堆越界 3、assert

ID: 虚拟机分配的唯一的线程ID,在Dalvik里,它们是从3开始的奇数。 Tid:linux的线程ID号 Stauts:线程状态,比较多,有下面的一些 ​ running: 正在执行程序代码 ​ sleeping:执行了Thread.sleep() ​ monitor:等待接受一个监听锁。 ​ wait::Object.wait(),等待被其他线程唤醒 ​ native:正在执行native代码, ​ vmwait:等待虚拟机,(这个不是很懂,高手指教,这个状态在什么情况下发生) ​ zombie:线程在垂死的进程 ​ init:线程在初始化(我们不可能看到) ​ starting:线程正在启动(我们不可能看到) utime:执行用户代码的累计时间 stime:执行系统代码的累计时间 name:线程的名字

04-22 11:12:22.105  8084  8691 E art     : JNI ERROR (app bug): accessed deleted global reference 0x7fa
04-22 11:12:22.128  8084  8691 F art     : art/runtime/java_vm_ext.cc:470] JNI DETECTED ERROR IN APPLICATION: use of deleted global reference 0x7fa
04-22 11:12:22.129  8084  8691 F art     : art/runtime/java_vm_ext.cc:470]     from android.hardware.usb.UsbRequest android.hardware.usb.UsbDeviceConnection.native_request_wait()
04-22 11:12:22.129  8084  8691 F art     : art/runtime/java_vm_ext.cc:470] "Usb Read Thread" prio=5 tid=22 Runnable
04-22 11:12:22.129  8084  8691 F art     : art/runtime/java_vm_ext.cc:470]   | group="main" sCount=0 dsCount=0 obj=0x32c46d30 self=0xdf4d8d00
04-22 11:12:22.129  8084  8691 F art     : art/runtime/java_vm_ext.cc:470]   | sysTid=8691 nice=0 cgrp=default sched=0/0 handle=0xc9c13920
04-22 11:12:22.129  8084  8691 F art     : art/runtime/java_vm_ext.cc:470]   | state=R schedstat=( 579270 485573 4 ) utm=0 stm=0 core=1 HZ=100
04-22 11:12:22.129  8084  8691 F art     : art/runtime/java_vm_ext.cc:470]   | stack=0xc9b11000-0xc9b13000 stackSize=1038KB
04-22 11:12:22.129  8084  8691 F art     : art/runtime/java_vm_ext.cc:470]   | held mutexes= "mutator lock"(shared held)
04-22 11:12:22.129  8084  8691 F art     : art/runtime/java_vm_ext.cc:470]   native: #00 pc 0034d971  /system/lib/libart.so (_ZN3art15DumpNativeStackERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEEiP12BacktraceMapPKcPNS_9ArtMethodEPv+128)
04-22 11:12:22.129  8084  8691 F art     : art/runtime/java_vm_ext.cc:470]   native: #01 pc 0032e131  /system/lib/libart.so (_ZNK3art6Thread9DumpStackERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEbP12BacktraceMap+308)
04-22 11:12:22.129  8084  8691 F art     : art/runtime/java_vm_ext.cc:470]   native: #02 pc 00237cad  /system/lib/libart.so (_ZN3art9JavaVMExt8JniAbortEPKcS2_+848)
04-22 11:12:22.129  8084  8691 F art     : art/runtime/java_vm_ext.cc:470]   native: #03 pc 00238243  /system/lib/libart.so (_ZN3art9JavaVMExt9JniAbortFEPKcS2_z+66)
04-22 11:12:22.129  8084  8691 F art     : art/runtime/java_vm_ext.cc:470]   native: #04 pc 00331b59  /system/lib/libart.so (_ZNK3art6Thread13DecodeJObjectEP8_jobject+240)
04-22 11:12:22.129  8084  8691 F art     : art/runtime/java_vm_ext.cc:470]   native: #05 pc 003f0bcb  /system/lib/libart.so (_ZN3art25JniMethodEndWithReferenceEP8_jobjectjPNS_6ThreadE+30)
04-22 11:12:22.129  8084  8691 F art     : art/runtime/java_vm_ext.cc:470]   native: #06 pc 0046cbdb  /system/framework/arm/boot-framework.oat (Java_android_hardware_usb_UsbDeviceConnection_native_1request_1wait__+86)
04-22 11:12:22.129  8084  8691 F art     : art/runtime/java_vm_ext.cc:470]   at android.hardware.usb.UsbDeviceConnection.native_request_wait(Native method)
04-22 11:12:22.129  8084  8691 F art     : art/runtime/java_vm_ext.cc:470]   at android.hardware.usb.UsbDeviceConnection.requestWait(UsbDeviceConnection.java:272)
04-22 11:12:22.129  8084  8691 F art     : art/runtime/java_vm_ext.cc:470]   at com.ximmerse.io.usb.JavaUsbStream.run(JavaUsbStream.java:196)
04-22 11:12:22.129  8084  8691 F art     : art/runtime/java_vm_ext.cc:470]   at android.os.Handler.handleCallback(Handler.java:751)
04-22 11:12:22.129  8084  8691 F art     : art/runtime/java_vm_ext.cc:470]   at android.os.Handler.dispatchMessage(Handler.java:95)
04-22 11:12:22.129  8084  8691 F art     : art/runtime/java_vm_ext.cc:470]   at android.os.Looper.loop(Looper.java:154)
04-22 11:12:22.129  8084  8691 F art     : art/runtime/java_vm_ext.cc:470]   at android.os.HandlerThread.run(HandlerThread.java:61)

复制

参考链接

  1. 关于Android中so的符号表导出以及C++的符号改编规则
  2. Android下打印调试堆栈方法 
  3. Coredump介绍及如何在Android中开启和使用来分析Crash等问题,coredumpandroid
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何识别C++编译以后的函数名 的相关文章

随机推荐

  • Mysql_me

    1 登录数据库系统 mysql h localhost u 用户名 root p 2 use 数据库名 3 show tables 查 4 显示表中数据 select from 表名 select from 表名 where 表项 数据 增
  • x86 细探:为什么要把迁移到 64 位 linux 称之为 x86 迁移

    一 引言 我们部门最近在把有些项目从原来的 AIX 平台迁移到 Linux 平台上 老大把这个项目自然而然的命名为了 x86 迁移 今天的我仔细思忖着这个名字 突然有些疑惑 x86 不是 32 位的吗 而我们迁移的目标系统是 64 位的 为
  • windows系统下运行vue项目war包(tomcat后台任务)

    1 下载安装配置tomcat 2 前端vue项目打包 3 后台java项目打包 4 运行 1 下载安装配置tomcat tomcat下载地址http tomcat apache org 找到这个东东点进去 下载好了找个位置解压就可以了 然后
  • C语言实现9*9乘法口诀表

    目录 一 基本概念 二 思路分析 三 代码实现 四 运行结果 一 基本概念 1 小学以来都在背的九九表 一 一得一 一二得二 2 该表中的乘法满足交换律 3 九九表展现如下 二 思路分析 1 1 首先要确认的是打印乘法时 所在的行与列 所以
  • windows下如何查看端口号?

    1 CTRL ALT DELETE 调出 启动任务管理器 页面 2 进入 windows任务管理器 页面 点击 性能 点击 资源监视器 3 进入 资源监视器 页面 点击 网络 即可查看Windows下的端口号
  • VBox:增加虚拟磁盘空间上限(虚拟系统为Linux)

    运行以下命令指定vdi虚拟磁盘空间新上限 此步骤需要在使用vdi磁盘文件的虚拟机关闭状态下执行 单位MB C Program Files Oracle VirtualBox gt vboxmanage modifyhd D vm spark
  • C++中的结构体继承一个类

    2023年8月5日 周六上午 在C 中 结构体可以继承另一个类 include
  • C语言类型转换----有符号数截断问题

    程序员面试宝典中有这个一道题 下面程序的结果是多少 include
  • SSHDroid及sshpass简介

    一 SSHDroid简介 SSH为Secure Shell的缩写 是建立在应用层基础上的安全协议 SSH是目前较可靠 专为远程登录会话和其他网络服务提供安全性的协议 利用SSH协议可以有效防止远程管理过程中的信息泄露问题 SSH客户端适用于
  • 4、如何在flink任务中读取外部数据源(DataStream API)

    1 Flink读取外部数据源的方式 Flink是一个流批一体的分布式计算框架 它不会存储数据 编写Flink计算任务的第一步就是通过连接器去读取外部数据 Flink提供了多种 预定义 data sources 来读取外部数据 如 文件 目录
  • Windows与Linux利用系统自带实现共享文件夹的功能

    这里需要两台机器在同一局域网或者可互相ping通 系统以Windows11和Windows Subsystem for Linux Ubuntu22 04 1 或国产Linux发行版的统信UOS 版本号20 为例 其他的版本系统也类似 非L
  • 使用python实现反欺诈模型,不平衡采样so easy!

    小天导语 周五的夜晚 各位亲们是不是开始期待双休呢 小天今天会在不平衡数据基础上 利用python建立反欺诈模型和分析数据 模拟分类预测模型中因变量分类出现不平衡的情况并解决反欺诈以及客户违约和疾病监测等问题 只要是因变量中各分类占比悬殊
  • muduo学习(一)

    大并发服务器架构设计 如何降低数据库 提高数据库的并发能力 的方法 1 队列 连接池 DAL 2 主要的业务逻辑挪到应用服务器处理 数据库只做辅助的业务处理 3 缓存 使用缓存的问题 缓存更新 同步 见链接 https www cnblog
  • pat乙级真题给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字

    题目描述 给定一系列正整数 请按要求对数字进行分类 并输出以下5个数字 A1 能被5整除的数字中所有偶数的和 A2 将被5除后余1的数字按给出顺序进行交错求和 即计算n1 n2 n3 n4 A3 被5除后余2的数字的个数 A4 被5除后余3
  • 默克尔树_默克尔树:正在使用中

    默克尔树 Ralph C Merkle not pictured above born 1952 is one of the founding fathers of Public Key Cryptography Throughout hi
  • geotools坐标转换

    报错 org geotools referencing operation MathTransformProvider geotools org postgresql ds PGSimpleDataSource geotools版本我使用的
  • LNK1169 LNK2005错误

    当我们在visual Studio 中编译时 经常会发生这两个错误 通常这两个错误是同时产生的 产生原因 找到一个或多个多重定义的符号 生成因一个或多个符号的多个定义而失败 该错误之前为错误 LNK2005 通常情况下 是因为不正确的使用导
  • 树莓派/PC实现实时摄像头数据共享—最优方法(搭建网络摄像头)

    目录 方法一 motion方式 方法二 MJPG streamer方式 之前做项目需要树莓派和PC进行视频传输 发现两种方法 方法一 Python OpenCv实现树莓派数据采集 树莓派搭建服务器 PC机作为客户端实现数据传输 结果发现传输
  • windows播放函数PlaySound

    在编写windows程序时 很多时候要用到播放音乐的函数 而windows下就提供了一个函数PlaySound 首先说下这个函数的使用范围 PlaySound函数用于播放一个音频文件 且这个文件时wav格式 且只能是wav格式 如果你需要混
  • 如何识别C++编译以后的函数名

    C C 语言在编译以后 函数的名字会被编译器修改 改成编译器内部的名字 这个名字会在链接的时候用到 如果用backtrace之类的函数打印堆栈时 显示的就是被编译器修改过的名字 比如说 Z3foov 那么这个函数真实的名字是什么呢 每个编译