一种查找C++函数符号所在文件的通用方法

#include<iostream>
using namespace std;

class symbol
{
public:
   symbol(){};
   ~symbol(){};
   void make_symbol(int a){return;}

};

int  main()
{
    symbol  test;
    test.make_symbol();
    return 0;
}

        在上面一个简单的程序中,如果我们要找make_symbol这个函数的实现,那么很容易就可以找到了,但如果是在一个大工程中的环境中,存在函数重载,又有很多重复的实现(代码没管理好导致),可能我们一点开工程,就有好几十个make_symbol函数,我们可以通过以下通用步骤去查找make_symbol具体的实现是在哪个文件中:

1.编译时,添加-g选项

g++  -g ./symbol.cpp

2.通过nm查找可能的符号

root@ubuntu:~/test/symbol# nm ./a.out | grep mak_symbol
root@ubuntu:~/test/symbol# nm ./a.out | grep make_symbol
00000000004006e4 W _ZN6symbol11make_symbolEi
00000000004006f2 W _ZN6symbol11make_symbolEii
root@ubuntu:~/test/symbol# 

3.还原符号

root@ubuntu:~/test/symbol# c++filt  _ZN6symbol11make_symbolEi
symbol::make_symbol(int)
root@ubuntu:~/test/symbol# c++filt _ZN6symbol11make_symbolEii
symbol::make_symbol(int, int)
root@ubuntu:~/test/symbol# 

  通过还原符号,我们我们可以得到原始的函数符号,这样就可以确定我们具体是需要哪个符号,比如我们需要第一个重载,那么我们需要进行第四步,通过符号地址,获取原始的文件

4.获取原始的实现文件

root@ubuntu:~/test/symbol# addr2line -e ./a.out  00000000004006e4 -f
_ZN6symbol11make_symbolEi
/home/lyj/test/symbol/./symbol.cpp:9
root@ubuntu:~/test/symbol# 

这样就可以获取到一个函数符号具体所在文件了。

おすすめ

転載: blog.csdn.net/lyj22/article/details/108066081
おすすめ