2009-08-18 6 views

답변

5

다음은 사용 가능한 전체 목록입니다. Visual Studio 2008 Compiler Intrinsics. 당신이 여기에서 특별히 찾고있는 것 중 하나는 _ReturnAddress ... 다른 것을 찾고 있습니다.

스택을 걷고 (프레임 포인터를 가져 오는) 내부적으로 StackWalk64을 사용하는 Visual Leak Detector stack walking mechanism의 세부 정보를 읽으십시오.

+0

그래도 그걸 보았습니다. __builtin_frame_address는 찾을 곳이 없습니다 ... – jameszhao00

+1

@james : now it^^ –

+0

최고입니다. 감사. – jameszhao00

1

선언 된 함수의 경우 프레임 주소는 함수 스택의 최상위에 있습니다 (esp이 가리키고 함수의 매개 변수 sizeof로 조정 됨). 나는 GCC가 일반적으로 ebp (VS에 대해서는 확실하지 않음)에 현재 함수에 대한 포인터를 저장한다고 생각한다. 그 메모리 위치는 포인터이며 반환 주소를 보유합니다. 함수의

__fastcall 선언, esp에 조정 레지스터에 전달되었을 수도 함수의 인수의 일부로서, 훨씬 작습니다.

나는 __stdcall에 대해 확실하지 않지만, 과 같으며, __cdecl과 같습니다.

+0

n> 0 일 때 __builtin_frame_address (n)은 어떻게 작동합니까? – jameszhao00

+0

공제. 런타임 솔루션은 추적하여 이전 스택 위치를 찾기 위해 스택을 팝핑하는 것을 시뮬레이션하는 것입니다. – greyfade

1

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 비트 아키텍처가 작동하지 않습니다 당신에게 도움이되지 않습니다.