2012-04-18 56 views
2

我一直在为此奋斗了大约一天。如何从ltrace获取C++堆分配的虚拟方法名称?

我能够构建一个简单的共享库和测试程序,当我在ltrace控制下运行它时,我可以根据预期获取方法名称,用于静态,虚拟和纯虚拟方法。

我使用cmake构建我的共享库。我有纯虚拟父类,有些方法会抛出异常。

当我在测试程序上运行ltrace时,我得到的唯一方法名是来自静态方法。

相反,我看到很多线路是这样的:

__gxx_personality_v0(1, 2, 0x474e5543432b2b00, 0x256c800, 0x7fff8d763170) 

使VERBOSE = 1所示:

... 
cd /home/chchr/src/build/csp-api/platform_services_lib_dynamic && /usr/bin/c++ -Dplatform_services_EXPORTS -DVERSION=10717 -DMAJOR_PACKAGE_VERSION=0 -DMINOR_PACKAGE_VERSION=9 -D__STDC_LIMIT_MACROS -D__STDC_FORMAT_MACROS -DRMOF_BIN=\"/usr/share/rmof.bin\" -shared -g -fPIC -I/home/chchr/src/csp-api/shared/inc -I/home/chchr/src/csp-api/enclosure-lib/inc -I/home/chchr/src/csp-api/compute-lib/inc -I/home/chchr/src/csp-api/storage-lib/inc -I/home/chchr/src/csp-api/RCIM/librcimcli -I/home/chchr/src/csp-api/RCIM/libRCIM -g -Wall -o CMakeFiles/platform_services.dir/__/shared/src/System.cpp.o -c /home/chchr/src/csp-api/shared/src/System.cpp 
... 
/usr/bin/c++ -fPIC -shared -g -shared -Wl,-soname,libplatform_services.so -o libplatform_services.so CMakeFiles/platform_services.dir/__/shared/src/System.cpp.o CMakeFiles/platform_services.dir/__/shared/src/System_Impl.cpp.o ../RCIM/librcim.so -lssl -lssh2 -lgcrypt -lslp -lcurl -lboost_system-mt -lboost_filesystem-mt -lboost_thread-mt -lpthread -Wl,-rpath,/home/chchr/src/build/csp-api/RCIM: 

任何想法去哪里找?谢谢!

好的,这是交易。如果一个对象在堆上分配,我没有看到虚拟/纯虚拟方法。如果它是在我的堆栈上:

#include "foo.hpp" 

int main() 
{ 
    foo::static_foo(); 

    foo_child* f = new foo_child; 
    f->real_foo(); 

    // ltrace doesn't report this one? 
    f->virtual_foo(); 
    // ltrace doesn't report this one? 
    f->pure_virtual_foo(); 

    foo_child g; 
    g.real_foo(); 

    // ltrace does report this one! 
    g.virtual_foo(); 
    // ltrace does report this one! 
    g.pure_virtual_foo(); 

    return 0; 
} 



$ ltrace -C ./f 
(0, 0, 0x23c300, -1, 0x1f25bc2)                  = 0x3715a21160 
__libc_start_main(0x4008e4, 1, 0x7fff1d54aa68, 0x400a40, 0x400a30 <unfinished ...> 
foo::static_foo()(1, 0x7fff1d54aa68, 0x7fff1d54aa78, 4, 0x3715f8b300)         = 0x3715f8cf60 
operator new(unsigned long)(8, 0x7fff1d54aa68, 0x7fff1d54aa78, 4, 0x3715f8b300)      = 0xfc4010 
foo::real_foo()(0xfc4010, 0xfc4020, 33, 0, 135168)             = 0xfc4010 
foo::real_foo()(0x7fff1d54a960, 0xfc4020, 0x7fc684611a86, 0, 135168)         = 0x7fff1d54a960 
foo::virtual_foo()(0x7fff1d54a960, 0xfc4020, 0x7fc684611a86, 0, 135168)        = 0x7fff1d54a960 
foo_child::pure_virtual_foo()(0x7fff1d54a960, 0xfc4020, 0x7fc684611a86, 0, 135168)     = 0x7fff1d54a960 
+++ exited (status 0) +++ 

任何线索?

+0

我创建一个Makefile做同样的事情,得到了相同的意想不到的结果:'所有:libpl.so简单 libpl.so: G ++轮候册, - 出口动态-fPIC -shared -o libpl.so \ -rdynamic \ -O0 -g \ -I ../ shared/inc \ -I ../ storage-lib/inc \ -I ../ compute-lib/inc \ -I ../ enclosure -lib/inc \ -I ../ RCIM/libRCIM \ -I ../ RCIM/librcimcli \ ../ shared/src/System.cpp' – 2012-04-19 01:00:23

+0

具有开始名称的函数使用__gxx或__cxa属于C++运行时,n ot到您的程序。不要担心他们。过滤出来,你应该只看到你的功能。 – 2012-04-19 14:55:58

回答

1

加 “-C” 与ltrace选项支持追查C++方法名

ltrace的手册页详细描述 “-C” 选项是:

-C,--demangle 解码(还原函数)将低级别符号名称转换为用户级名称。除了删除由系统预设的任何初始下划线外,这使得C++函数名称可读。

ltrace -C程序

输出应该是这样的:

*的std :: basic_string的,性病::分配器> :: basic_string的(的std :: string常量&)(0x8fb940,0x7fff6fc680b0,0x7fff6fc680b0 ,0x50535f4444415f46,0x4c4941465f455241)= 0x1970be8 *

虽然有时它仍然是一个有点费解,享受^ _^

+0

对不起,我不够清楚......我已经做到了。问题是,并不是所有的方法都显示在输出中,对于我的生活我无法弄清楚什么是错的。我试图将其缩小为一个无法发布的小例子。 – 2012-04-19 14:39:50