Linux命令c++filt

原创 2016年08月31日 00:27:55

一个简单的linux命令, 确实不值得大费周折, 但是, 在实际的开发过程中,却帮助很大,在编译cgi,修改函数的调用之后获得函数的符号名,就可以看到这个函数的定义。


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.

$ c++filt _ZN1N1C4FuncEi
N::C::Func(int)


相关文章推荐

相见恨晚:linux下的c++filt 命令

一个简单的linux命令, 确实不值得大费周折, 但是, 如果能与实际开发工作联系起来, 解决实际开发中的困惑, 在生动的实际场景中学习命令, 那无疑是棒棒哒的感觉。 最近刚好用c++filt解决了相...
  • stpeace
  • stpeace
  • 2016年05月15日 11:42
  • 3431

c++filt看函数名

gdb查看寄存器 i r   查看有意义的信息 函数后面的+num(行数) 然后在gdb中用反汇编指令disassemble 在指定行下看编译信息 _ZN6apsara5pangu15ScopedCh...

linux下c++filter查看函数修饰名

c++函数在编译之后会变成类似下面的样子: _ZNK4Json5ValueixEPKc   在linux命令行使用c++filter: root@SSDEV016:~ $ c++filt _ZNK4J...

c++filt address2line GDB栈跟踪

http://www.wuzesheng.com/?p=1804    前几天帮同事跟踪的一个程序莫名退出,没有core dump(当然ulimit是打开的)的问题。我们知道,正常情况下,如果程序...

相见恨晚:linux下的c++filt 命令

一个简单的Linux命令, 确实不值得大费周折, 但是, 如果能与实际开发工作联系起来, 解决实际开发中的困惑, 在生动的实际场景中学习命令, 那无疑是棒棒哒的感觉            最...

c++filt

c++filt decodes (demangles) low-level names into user-level names so that the linker can keep these...
  • bonny95
  • bonny95
  • 2011年09月14日 11:15
  • 5288

使用c++filt查看trafficserver堆栈调用信息

在实际运维中,我们经常遇到Apache Traffic Server遇到段错误时,在traffic.out中留下的堆栈调用信息,比如下面的 FATAL: ../.././ats-4.2.0/proxy...
  • tao_627
  • tao_627
  • 2015年03月25日 11:11
  • 730

Linux命令 + C++API.zip

  • 2017年11月03日 21:36
  • 434KB
  • 下载

Linux下 编译C++/C以及常用的几种命令(ubuntu)

今天有学弟问我一个C的问题,本来想着用java解决一下,结果发现某些语句是不通的,后来下载安装了codeblocks,尝试的过程中总是提示没有最高的执行权限,我日......后来想到用g++来编译,无...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux命令c++filt
举报原因:
原因补充:

(最多只允许输入30个字)