2014-01-10 5 views
2

가상 메소드에 대한 C++ 객체 포인터와 호환 가능한 메소드 포인터가 주어지면 호출 할 실제 콘서트 기능을 가리키는 포인터를 원격으로 가져올 수있는 방법이 있습니까?메소드 포인터에서 "실제"함수 얻기

유스 케이스는 디버거 심볼이 실제로 호출하지 않고 호출 할 유형/함수의 이름을 얻으려는 상기 포인터를 실행하려고한다는 것입니다.

구현 특정 솔루션을 통해서만 가능하다면, 주로 GCC/LLVM을 지원하는 데 관심이 있습니다.

+0

http://stackoverflow.com/questions/77005/how-to-generate-a-stacktrace-when-my-gcc-c-app-crashes를 확인하십시오. 도움이 될 수도 있습니다. – cup

+0

@cup은 "주어진 포인터, 사용 가능한 문자열 얻기"비트를 다루는 것처럼 보입니다.이 비트는 이미 다룰 줄 안다는 것을 이미 알고 있습니다. – BCS

답변

0

LLVM과 GCC 모두 Itanium C++ ABI을 따르므로 여기에 지정된대로 데이터 구조를 읽을 수있는 방법을 찾아야합니다. 나는 대략적인 개요를 줄 것이다.
가상 멤버에 대한 포인터는 어떤 이유로 가상 함수 테이블에 대한 오프셋으로 표시됩니다.

class A { 
public: 
    virtual void f(); 
    virtual void g(); 
}; 

void (A::*pAg)() = & A::g; 
ptrdiff_t offset = *(ptrdiff_t*)(&pAg) - 1; 

가상 테이블에 대한 포인터는 일반적으로 권리 객체의 시작 부분에 위치 :

A a; 
void* vtable = *(void**)&a; 

는 그런 다음이 가상 테이블 내의 오프셋 (offset) 계산을보고 실제 함수 포인터를 찾을 수 있습니다.

void* function = *(void**)(vtable+offset) 
+0

나는 포기할 수있는 휴대용 솔루션에 대한 끊임없는 희망을 포기하는대로 시도해 보겠습니다. – BCS

관련 문제