(gdb) info line *0x33fd12b0
Line 49 of “/usr/include/c++/4.8.2/ext/atomicity.h” starts at address 0x33fd12ad <_PATH::~_PATH()+349>
and ends at 0x33fd12b4 <_PATH::~_PATH()+356>.
曾经碰到过上面一句,但是从代码里看就是不知道这个是怎么调用到的atomicity.h 的代码;思索良久没有找到方法,后来无意看到一个命令,可以dump出来如下的函数关系图:
__exchange_and_add
/usr/include/c++/4.8.2/ext/atomicity.h:49
__exchange_and_add_dispatch
/usr/include/c++/4.8.2/ext/atomicity.h:82
std::string::_Rep::_M_dispose(std::allocator const&)
/usr/include/c++/4.8.2/bits/basic_string.h:246
~basic_string
/usr/include/c++/4.8.2/bits/basic_string.h:539
_PATH::~_PATH()
这就很明显了,这个就是再析构时,也析构了一个string对象,一步步调用到了atomicity.h里的__exchange_and_add函数。
后来找到了一个方法,其实就是:
addr2line -C -f -i -e ng.elf 0x33fd12b0
但是为什么gdb不能而addr2line 可以呢?是什么配置导致的吗?
其实gdb已经够可以的了可以看到原子操作。
0x0000000033fd12ad <+349>: or $0xffffffff,%eax
0x0000000033fd12b0 <+352>: lock xadd %eax,(%rdx)
0x0000000033fd12b4 <+356>: test %eax,%eax