2012-04-18 8 views
2

나는 약 하루 동안 이것을 고심하고있다.어떻게 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) +++ 

실마리가 있습니까?

+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' –

+0

이름이 시작되는 함수 __gxx 또는 __cxa는 C++ 런타임에 속합니다. 귀하의 프로그램에. 그들에 대해 걱정하지 마십시오. 그들을 필터링하고 당신은 당신의 기능을 볼 수 있어야합니다. –

답변

1

추가 "-C"

은 ltrace의 매뉴얼 페이지 discription "-C"옵션이 ++ 추적 C를 지원하는 방법 이름에은 ltrace와 옵션 :

-C, --demangle 디코드 (디맹 글링) 하위 레벨 기호 이름을 사용자 레벨 이름으로 변환합니다. 시스템 앞에 붙은 초기 밑줄을 제거하는 것 외에도 C++ 함수 이름을 읽을 수 있습니다.

은 ltrace -C 프로그램

출력 이렇게해야

* STD :: basic_string을 표준 : 할당> :: basic_string (표준 : 문자열 CONST &) (0x8fb940, 0x7fff6fc680b0, 0x7fff6fc680b0 , 0x50535f4444415f46, 0x4c4941465f455241) = 0x1970be8 * 때로는 이해하기 위해 여전히 조금 어렵지만

,^_^

+0

미안하지만, 나는 충분히 명확하지 않다 ... 나는 그것을했다.문제는 모든 방법이 결과물에 나타나지 않고 나와 삶이 잘못되었다는 것을 알 수 없다는 것입니다. 게시하지 않는 작은 예제로 줄이려고합니다. –