2009-03-26 5 views
0

C++ 디버그 응용 프로그램에서 callstack 프레임의 수를 쉽게 계산할 수 있기를 원합니다. 이 작업을 수행 할 수있는 OS 기능이 있습니까?콜 스택 (callstack) 프레임 수는 어떻게 계산합니까?

Windows 및 Posix, 즉 크로스 플랫폼에이 기능이 필요합니다. 두 플랫폼 중 하나 또는 둘 모두에 대한 솔루션이 우수합니다.

모든 프레임을 찾기 위해 스택을 걸을 수 있지만 쉽게 호출 할 수 있는지 궁금해했습니다.

답변

2

아니요, 이것은 컴파일러의 문제이기 때문에 아닙니다.

컴파일러는 자체 ABI를 자유롭게 정의 할 수 있습니다. 이것은 콜 스택 (있는 경우)이 정의되는 방법을 정의합니다. 순수한 "C"를 사용하지 않는 한, 이것은 사소하지 않고 모든 컴파일러마다 다를 것입니다.

또한 MS가 스택 프레임이 메모리 주위에 무작위로 배치되어 리턴 점프에 영향을 미치는 버퍼 오버 플로우 공격을 방지하기 위해 새로운 스키마를 사용한다는 소식을 들었습니다. 정확하게 관련이 없지만 재미있는 사실. 당신은 (리눅스)의 glibc를 사용하는 경우

+0

마지막으로 스택 프레임에 반송 주소를 덮어 쓰기 전에 겹쳐 써야하는 임의의 "쿠키"를 넣었다 고 들었습니다. 그런 다음 함수 반환시 쿠키가 확인되고 변경된 경우 앱이 종료됩니다. – Eclipse

+0

Microsoft의 스택 쿠키는 재미있는 부분이 이미 없어 졌기 때문에 안전을 위해 사용해서는 안됩니다. 스택 프레임은 실제로 "스택"전체를 무력화하기 때문에 무작위로 배치되지 않습니다. –

+0

쿠키를 언급하지 않았습니다. 나는 프레임의 실제 배치를 언급하고 있었다. 어떤 잠재적으로 메모리에 (컴파일러에서 여분의 배선) 비트 수 있습니다. 스택은 기술적으로 스택이 될 필요가없는 정보를 기록하는 가장 단순한 방법 일뿐입니다. –

0

당신은 스택 추적을 얻기 위해 다음과 같은 기능을 사용할 수 있습니다

#include <execinfo.h> 
int backtrace(void **buffer, int size); 
char **backtrace_symbols(void *const *buffer, int size); 
void backtrace_symbols_fd(void *const *buffer, int size, int fd); 

자세한 내용은 역 추적에 대한 매뉴얼 페이지를 참조하십시오.

관련 문제