gpt4 book ai didi

c++ - 如何从 ltrace 获取 C++ 堆分配的虚拟方法名称?

转载 作者:太空狗 更新时间:2023-10-29 12:20:36 26 4
gpt4 key购买 nike

我已经为此苦苦挣扎了大约一天。

我能够构建一个简单的共享库和测试程序,当我在 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) +++

有什么线索吗?

最佳答案

为 ltrace 添加“-C”选项以支持跟踪 C++ 方法名称

ltrace "-C"选项的手册页描述是:

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

ltrace -C 程序

输出应该是这样的:

*std::basic_string, std::allocator>::basic_string(std::string const&)(0x8fb940, 0x7fff6fc680b0, 0x7fff6fc680b0, 0x50535f4444415f46, 0x4c4941465f455241) = be8*1970

虽然有时还是有点难以理解,但请欣赏^_^

关于c++ - 如何从 ltrace 获取 C++ 堆分配的虚拟方法名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10219394/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com