如何从 ltrace 获取堆分配C++虚拟方法名称
how can I get C++ heap allocated virtual method names from ltrace?
我已经为此苦苦挣扎了大约一天了。
我能够构建一个简单的共享库和测试程序,当我在 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 将低级符号名称解码(解散)为用户级名称。除了删除系统前面的任何初始下划线外,这C++函数名称都可读。
ltrace -C 程序
输出应如下所示:
*std::basic_string, std::分配器>::basic_string(std::string const&)(0x8fb940, 0x7fff6fc680b0, 0x7fff6fc680b0, 0x50535f4444415f46, 0x4c4941465f455241) = 0x1970be8*
虽然有时仍然有点难以理解,但请享受 ^_^
这是 ltrace 中的一个错误。 正式报告:http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=669416
相关文章:
- 虚拟决赛作为安全
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- 如何在C++中获得"静态纯虚拟"功能?
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 大小虚拟继承中的派生类
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 使用 C++ 和 i2c 工具从虚拟 i2c 写入和读取
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 如果整个应用程序是虚拟映射的,为什么 new 会进行系统调用?
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- std::is_trivially_copyable_v 关于虚拟功能
- 删除C++继承中虚拟类成员的代码重复
- 子类地址等于虚拟基类地址?
- 当覆盖存在时调用基本虚拟"binded to object"函数
- 用于创建/注册虚拟存储设备的 IOKit 驱动程序
- 是否可以使用基类非虚拟方法中的派生类虚拟方法?