가까운 시간대에 ARM 프로세서에서 실행하려는 C 프로그램을 만들고 있습니다. 스택/힙의 크기를 무시하면서 전역 변수를 사용하여 메모리 양을 측정하고 싶습니다. 컴파일시에 gcc를 덤프하거나 컴파일 된 바이너리에서이 정보를 검색하는 방법이 있습니까?글로벌 변수의 총 크기는 어떻게 측정합니까?
답변
메모리가 어디로 가고 있는지 확인하는 가장 좋은 방법은 링커 맵을 보는 것입니다. 링커 맵은 링커에서 생성하고 프로그램의 모든 메모리 위치를 자세히 설명하는 파일입니다. 전역 변수와 코드에 대한 심볼 단위의 메모리 할당을 볼 수 있습니다. 나는 메모리 요구 사항이 엄격한 프로젝트를 위해 과거에 링커 맵을 사용했다. 공간을 많이 차지하는 전역 메모리 버퍼와 같은 문제 영역을 쉽게 식별 할 수 있습니다.
-Wl, -map =
output.map : 링커 맵을 생성하기 위해 GCC 명령 줄에이 옵션을 추가GNU binutils 제품군에는 "크기"라는 프로그램이 포함되어 있습니다.이 프로그램은 필요한 데이터를 얻는 가장 쉬운 방법이며, 최소한 합리적인 근사치입니다. 처음 세 열을 바이너리의 섹션의 크기입니다
text data bss dec hex filename
332268 2200 19376 353844 56634 test-directory/add
: (이 경우, 적지 않은 임베디드 하나) 일반 프로그램의 경우, 출력은 다음과 같을 수 있습니다 "텍스트"실행 코드가, "데이터"는 명시적인 이니셜 라이저로 초기 변수를 나타내는 것을 포함하여 상수 등이며 "bss"는 암시 적으로 정적으로 초기화되는 모든 것에 대한 이니셜 라이저입니다. 일반적인 임베디드 프로그램에서 정적 초기화 프로그램은 전역 변수에 대해 독점적으로 사용됩니다 (스택이나 힙에 있지 않으므로 측정에 다른 정적 변수를 포함하는 것이 좋습니다).
따라서 "데이터"와 "bss"의 합계가 결국 원하는 것입니다. (hlovdal에 연결된 기사를 읽은 후에 나는 이것보다 확신이 없으며, 아마도 의견 작성자가 확인을 추가 할 수 있습니까?)
(그 다음에 "dec"과 "hex"는 모든 십진수의 총 크기입니다. 16 진수이며 "filename"은 물론 명확합니다.)
- 1. 스트로크 각은 어떻게 측정합니까?
- 2. 단위 테스트의 이점을 어떻게 측정합니까?
- 3. 글로벌 변수의 기본 저장소 클래스는 무엇입니까?
- 4. 글로벌 자바 스크립트 변수의 값 변경
- 5. 구조체의 크기는 어떻게 찾습니까?
- 6. 폴더의 크기는 어떻게 얻습니까?
- 7. PDF 크기는 어떻게 지정됩니까?
- 8. 프레임의 크기는 어떻게 변경합니까?
- 9. 특정 방문자가 사이트에서 보낸 시간은 어떻게 측정합니까?
- 10. 렌더링되기 전에 WPF에서 TextBlock의 크기를 어떻게 측정합니까?
- 11. 사용자 당 다운 스트림 대역폭을 어떻게 측정합니까?
- 12. ASP.NET 내 페이지 캐싱 어떻게 작동하는지 측정합니까?
- 13. 전선에서 T-SQL 쿼리의 비용을 어떻게 측정합니까?
- 14. JBOSS 7 서버의 시작 시간은 어떻게 측정합니까?
- 15. 프로세스의 CPU 코어 사용량을 어떻게 측정합니까?
- 16. 소프트웨어를 통해 흐르는 모든 쿼리를 어떻게 측정합니까?
- 17. 당신은 어떻게 측정합니까? SQL Fill Factor 값
- 18. 저장 프로 시저의 성능을 어떻게 측정합니까?
- 19. 동적 RSS 피드의 트래픽을 어떻게 측정합니까?
- 20. SharePoint 목록의 크기는 어떻게 결정합니까?
- 21. 페이지 테이블 크기는 어떻게 계산합니까?
- 22. UILabel의 글꼴 크기는 어떻게 계산합니까?
- 23. 헤더 섹션의 크기는 어떻게 변경합니까?
- 24. 최대 스택 크기는 어떻게 찾습니까?
- 25. 변수의 이름을 어떻게 지정합니까?
- 26. NSUserDefaults를 글로벌 인스턴스 변수의 일종으로 사용하는 것은 나쁜 생각입니까?
- 27. ZF에서 "글로벌"구성을 어떻게 사용합니까?
- 28. 어떻게 글로벌 자바 스크립트 변수
- 29. 어떻게 글로벌 스타일 시트가있어, 간단히 말해서 글로벌 스타일
- 30. 텍스트 크기는