#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#
这样就可以获取到一个函数符号具体所在文件了。