문제

있는 방법을 알아 및 출력 스택 크기에 필요한 기능을 컴파일 시 C?여기에는 무엇이 있는지 알고 싶:

의 일부 기능:

void foo(int a) {
    char c[5];
    char * s;
    //do something
    return;
}

컴파일하는 경우 이 함수,나는 방법을 알고 싶다면 많은 스택에 공간을 소비하 같다.이 유용할 수 있을 감지 스택에서는 선언의 구조를 숨기고 큰 버퍼입니다.

내가 찾는 것이 무엇인가 무언가를 인쇄 다음과 같다:

파일 foo.c:기능 foo 스택 사용 n

는 방법이 있을 보지에서 생성된 어셈블리를 알고 계십니까?또한 제한을 설정할 수 있는 컴파일러가?

업데이트:난을 피하려고 노력하 runtime stack overflow 주어진 프로세스를 위해,내가 찾는 방법을 찾기 전에 runtime,함수의 경우 스택 사용량에 의해 결정되는 컴파일러를 사용할 수 있의 출력으로 컴파일 과정입니다.

의 그것을 다른 방법을 넣어:를 아는 것은 가능한 크기는 모든 개체의 현지하는 기능입니까?나는 컴파일러 최적화되지 않 나의 친구이기 때문에,어떤 변수가 사라집니다하지만 우수한 제한은 괜찮습니다.

도움이 되었습니까?

해결책

리눅스 커널 코드에서 실행되는 4K 스택에 x86.따라서 그들은 care.그들은 무엇을 확인하기 위해 사용하는 perl 스크립트들을 썼는 당신이 찾을 수 있습으로 scripts/checkstack.pl 최근에는 커널 타볼(2.6.25 그것을 가지고).에서 실행 출력 objdump,사용 설명서에서는 초기 comment.

내 생각에 이미 사용한 사용자 공간에 바이너리,전 연령대와 알고 있는 경우의 비트 perl 프로그래밍,그것은 쉽게 수정하는 경우가 깨진 것입니다.

어쨌든 무엇을,그것은 기본적으로는 보고서는 자동으로 GCC 의 출력됩니다.사 커널 해커가 쓴 이러한 도구이 없다는 것을 의미한 정적 그것을 할 수 있는 방법으로 GCC(또는 어쩌면 그것에 추가되었고 최근이지만,저는 그래서 의심).

Btw,와 objdump 에서 필요한 프로젝트 및 ActivePerl,또는 Cygwin,당신이 할 수 있어야 하는 또한 윈도우즈에서 얻어진 바이너리로 다른 컴파일러입니다.

다른 팁

StackAnlyser 보 examinate 실행 코드 자체 플러스 일부를 디버깅 정보.무엇에 의해 설명 이 답변, 하는 것,내가 찾는 것은,스택 분석기처럼 보이 잔인한다.

비슷한 무엇을 위해 존재하는 에이 허용될 수 있습니다.이보 매뉴얼 페이지에서 제공하는 수동:

22.2 정적 스택 사용 분석

단위 컴파일-fstack-사용을 생성합니다 추가 파일을 지정하는 최대 크기의 스택 사용되는,당능 기준입니다.이 파일은 동일한 기본 이름으로 대상체 파일이다.스와 확장자.각 라인의 이 파일의 필드:

* The name of the function.
* A number of bytes.
* One or more qualifiers: static, dynamic, bounded. 

두 번째는 분야의 크기에 해당하는 알려진 기능의 일부 프레임입니다.

한정한 정적 의미 있는 기능 프레임 크기는 순수하게 고정되어 있습니다.그것은 일반적으로 의미하는 모든 지역 변수가 있는 정적 크기입니다.이 경우,이와 같은 두 번째 항목은 사용자에게 안정적인 측정 기능의 스택 사용률 등이 있습니다.

규정 동적인 의미는 기능 프레임 크기는 정적이 아닙니다.그것이 일어날 때에 주로 일부 지역 변수는 변동이 가능한 사이즈를 가집니다.이 규정이 나타나 혼자 두 번째 필드지 않은 안정적인 측정 기능의 스택을 분석합니다.할 때 자격으로 제한,그것이 의미하는 두 번째 필드를 신뢰할 수 있는 최대의 기능택 사용률 등이 있습니다.

정적 코드 분석이 왜 이것에 대해 충분한 수치를 줄 수 없는지 모르겠습니다.

주어진 함수에서 모든 로컬 변수를 찾는 것은 사소한 일이며, 각 변수의 크기는 C 표준 (내장 유형의 경우) 또는 계산 (스트러크 및 노조와 같은 복잡한 유형)을 통해 찾을 수 있습니다.

물론, 컴파일러는 패딩과 같은 다양한 종류의 최적화를 수행하거나 레지스터에 변수를 넣거나 불필요한 변수를 완전히 제거 할 수 있기 때문에 답은 100% 정확한 것으로 보장 할 수 없습니다. 그러나 그것이주는 모든 대답은 적어도 좋은 추정치가되어야합니다.

빠른 Google 검색을 수행하여 찾았습니다 Stackanalyzer 그러나 다른 정적 코드 분석 도구에는 비슷한 기능이 있다고 생각합니다.

100% 정확한 그림을 원한다면 컴파일러의 출력을 보거나 런타임 중에 확인해야합니다 (Ralph가 제안한 Ralph가 그의 대답)

컴파일러만이 정말로 알고있을 것입니다. 왜냐하면 그것은 당신의 모든 물건을 모으는 사람이기 때문입니다. 생성 된 어셈블리를보고 서문에 얼마나 많은 공간이 예약되어 있는지 확인해야하지만 실제로는 다음과 같은 것을 설명하지 않습니다. alloca 런타임에 그들의 일을합니다.

임베디드 플랫폼에 있다고 가정하면 툴체인이이를 알 수 있습니다. 우수한 상업용 임베디드 컴파일러 (예 : ARM/KEIL 컴파일러)는 종종 스택 사용에 대한 보고서를 생성합니다.

물론, 인터럽트와 재귀는 일반적으로 그들을 넘어서지 만, 누군가가 어딘가에 스택에 멀티 메가 바이트 버퍼가있는 끔찍한 나사로를 저지른 경우 거친 아이디어를 제공합니다.

정확히 "컴파일 시간"은 아니지만 제작 후 단계 로이 작업을 수행합니다.

  • 링커가 당신을 위해 맵 파일을 만들도록하십시오
  • 맵 파일의 각 함수에 대해 실행 파일의 해당 부분을 읽고 Prologue 기능을 분석하십시오.

이것은 Stackanalyzer가하는 것과 비슷하지만 훨씬 간단합니다. 실행 파일 또는 분해를 분석하는 것이 컴파일러 출력에 접근 할 수있는 가장 쉬운 방법이라고 생각합니다. 컴파일러는 내부적으로 이러한 것들을 알고 있지만, 당신은 그것을 얻을 수 없을 것 같습니다 (컴파일러 공급 업체에 기능을 구현하거나 오픈 소스 컴파일러를 사용하는 경우 직접 수행하거나 누군가가 할 수 있습니다. 당신을 위한).

이를 구현하려면 다음을 수행해야합니다.

  • 맵 파일을 구문 분석 할 수 있습니다
  • 실행 파일의 형식을 이해하십시오
  • Prologue가 어떻게 보일 수 있는지 알고 그것을 "디코딩"할 수 있습니다.

이것이 얼마나 쉽고 어려운지는 대상 플랫폼에 따라 다릅니다. (내장? 어떤 CPU 아키텍처? 어떤 컴파일러?)

이 모든 것은 확실히 x86/win32에서 수행 할 수 있지만, 이와 같은 일을 한 적이없고 처음 부터이 모든 것을 만들어야한다면, 완료되기까지 며칠이 걸리고 작동하는 일을 할 수 있습니다.

일반적으로 아닙니다. 이론적 컴퓨터 과학의 중단 문제는 일반적인 프로그램이 주어진 입력을 중단하는지 예측할 수 없음을 시사합니다. 일반적으로 프로그램 실행에 사용되는 스택을 계산하는 것이 훨씬 더 복잡합니다. 그래서 안돼. 아마도 특별한 경우.

재귀 수준이 임의의 길이가 될 수있는 입력에 의존하고 이미 운이없는 재귀 함수가 있다고 가정 해 봅시다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top