다음 중 Visual C++ 버전이 있습니까 (GCC)?GCC 함수의 Visual C++ 버전
__builtin_return_address
__builtin_frame_address
참조 - http://gcc.gnu.org/onlinedocs/gcc/Return-Address.html
없는 경우에, 그 (것)들을 에뮬레이트하는 방법이 있나요?
감사합니다.
다음 중 Visual C++ 버전이 있습니까 (GCC)?GCC 함수의 Visual C++ 버전
__builtin_return_address
__builtin_frame_address
참조 - http://gcc.gnu.org/onlinedocs/gcc/Return-Address.html
없는 경우에, 그 (것)들을 에뮬레이트하는 방법이 있나요?
감사합니다.
다음은 사용 가능한 전체 목록입니다. Visual Studio 2008 Compiler Intrinsics. 당신이 여기에서 특별히 찾고있는 것 중 하나는 _ReturnAddress ... 다른 것을 찾고 있습니다.
스택을 걷고 (프레임 포인터를 가져 오는) 내부적으로 StackWalk64을 사용하는 Visual Leak Detector stack walking mechanism의 세부 정보를 읽으십시오.
선언 된 함수의 경우 프레임 주소는 함수 스택의 최상위에 있습니다 (esp
이 가리키고 함수의 매개 변수 sizeof
로 조정 됨). 나는 GCC가 일반적으로 ebp
(VS에 대해서는 확실하지 않음)에 현재 함수에 대한 포인터를 저장한다고 생각한다. 그 메모리 위치는 포인터이며 반환 주소를 보유합니다. 함수의
이 __fastcall
선언, esp
에 조정 레지스터에 전달되었을 수도 함수의 인수의 일부로서, 훨씬 작습니다.
나는 __stdcall
에 대해 확실하지 않지만, 은과 같으며, __cdecl
과 같습니다.
n> 0 일 때 __builtin_frame_address (n)은 어떻게 작동합니까? – jameszhao00
공제. 런타임 솔루션은 추적하여 이전 스택 위치를 찾기 위해 스택을 팝핑하는 것을 시뮬레이션하는 것입니다. – greyfade
VC가 프레임 포인터 생략이라는 최적화를 수행하므로 __builtin_frame_address가있는 경우 해당 함수가 최적화 된 코드에서 작동하지 않을 수 있습니다. 여기에 설명 된 바와 같이 그러나, 그 최적화를 해제 할 수 있습니다 x86 용 당신이 http://msdn.microsoft.com/en-us/library/4ks26t93(VS.71).aspx 불행하게도 인라인 어셈블리 코드를 작성할 수 있습니다, http://msdn.microsoft.com/en-us/library/2kxx5t2c(VS.71).aspx
하는 것으로 아마 잘못되고, 그래서 그것은 64 비트 아키텍처가 작동하지 않습니다 당신에게 도움이되지 않습니다.
_AddressOfReturnAddress을 사용하여 프레임 주소를 확인할 수 있습니다.
그래도 그걸 보았습니다. __builtin_frame_address는 찾을 곳이 없습니다 ... – jameszhao00
@james : now it^^ –
최고입니다. 감사. – jameszhao00