나는 약 하루 동안 이것을 고심하고있다.어떻게 ltrace에서 C++ 힙 할당 가상 메서드 이름을 얻을 수 있습니까?
평범한 공유 라이브러리와 테스트 프로그램을 만들었습니다. ltrace 컨트롤로 실행할 때 정적, 가상 및 순수 가상 메서드에 대해 예상대로 메서드 이름을 얻을 수있었습니다.
cmake를 사용하여 공유 라이브러리를 구축합니다. 순수 가상 부모 클래스가 있고 일부 메서드는 예외를 throw합니다.
테스트 프로그램에서 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) +++
실마리가 있습니까?
내가 같은 일을 Makefile을 생성하고 같은 예기치 않은 결과가 있어요 : 정식으로보고'모든 : 간단한 libpl.so libpl.so을 : g ++ -Wl, - 수출 - 동적 -fPIC -shared -o libpl.so \ -rdynamic \ -O0 -g \ -I ../ 공유/INC \ -I ../ 저장-lib 디렉토리/INC \ -I ../ 연산 lib 디렉토리/INC \ -I ../ enclosure-lib/inc \ -I ../ RCIM/libRCIM \ -I ../ RCIM/librcimcli \ ../ shared/src/System.cpp' –
이름이 시작되는 함수 __gxx 또는 __cxa는 C++ 런타임에 속합니다. 귀하의 프로그램에. 그들에 대해 걱정하지 마십시오. 그들을 필터링하고 당신은 당신의 기능을 볼 수 있어야합니다. –