Visual Studio에서 프로그램이 차지하는 Stack과 Heap 메모리 크기를 실시간으로 볼 수 있나요?

익명 사용자의 이미지

코딩을 하다가 문뜩 실시간으로 메모리 크기를 알고 싶다는 생각이 들었습니다. 그래서 Visual Studio로 시도해보았는데

목표는 프로그램에서 Stack과 Heap의 메모리 크기를 실시간으로 보고싶습니다.

(사진을 넣기가 안되네요 보기 쉽게 파일로 첨부해두었는데 그림 첨부가 가능한가요? (하나는 cmd 입력, 하나는 debug창 사진)

그래서 아래 코드를 Visual Studio의 디버그 모드의 Diagnostics Tools을 이용해서 Memory Usage를 Snapshot으로 찍어서 확인해봤는데 Heap 크기의 경우 (int형 4바이트)를 malloc으로 할당하는데 0.04KB씩 상승하는걸 보았습니다.

사용법이 맞는진 잘모르겠어서 일단 시도해보았는데 Heap 할당이 4바이트가 아닌 0.04kb씩 상승하는 것도 이해가 안되고 Stack 크기는 어디서 봐야할지..

고수님들의 도움이 절실합니다. 이런걸 실시간으로 볼 수 있는 툴이나 다른 사용방법 혹은 왜 0.04kb씩 아래 사진에서 Heap 크기가 증가하게 되는지.. 궁굼합니다.

#include <stdio.h>
int* arr[100];
int main() {
 
	int i = 0;
	while (getchar() != 'q') { //입력 받을때마다 할당이 메모리 할당이 한번씩 이루어지게 하는게 목적입니다.
		getchar(); //Enter를 넘기는 용도입니다.
		printf("%d --\n", i);
		arr[i] = (int*)malloc(sizeof(int));
		i++;
	}
 
}

File attachments: 
익명 사용자의 이미지

1. Stack usage를 보는 방법은 간단합니다. stack pointer를 찍어보면 되지요.

stack은 한 방향으로만 자라기 때문에 stack pointer의 증감이 곧 stack usage를 그대로 보여줍니다.

물론 그 추이를 실시간으로 보여주는 방법이 있을지는 또 다른 문제입니다. 있을 법도 한데 잘 모르겠네요. 사실 별로 관심을 가진 적이 없어서요.

2. malloc(4)를 했는데도 4byte 이상 heap usage가 늘어나는 이유는, malloc이 딱 주어진 크기 만큼의 메모리만 할당할 수는 없기 때문입니다.

(1) malloc 등의 메모리 할당 메커니즘은 할당된 메모리, 그리고 할당되지 않은 메모리들을 추적하기 위해 메타데이터 자료구조를 유지해야 합니다.

(2) 위 이유의 연장선에서, 메모리를 너무 잘게 쪼개서 할당해주려면 관리 부담이 늘어나게 되겠죠.

(3) 더욱이, malloc이 반환하는 포인터는 가장 엄격한 fundamental alignment requirement를 만족시켜야 합니다. 대개의 경우 이 조건에 따라 malloc이 반환하는 포인터는 어떤 2의 거듭제곱의 배수여야만 합니다.

예컨대 그 조건이 16의 배수라면, malloc으로 단 한 바이트를 할당받는다고 해도 16바이트의 메모리가 통째로 할당되는 것과 다를 바 없죠.

3. C언어에서 malloc-free로 할당하고 해제되는 메모리의 크기를 바이트 단위로 정확하게 추적하려면, 가장 직관적인 방법은 malloc-free 함수 호출을 가로채는 겁니다.

후킹 같은 복잡한 수를 동원해야 하는 경우도 있겠지만, 애초에 측정 대상이 전적으로 내 프로그램이라면 my_malloc, my_free 같이 수동으로 wrapping하는 방법도 있겠지요.

물론 calloc, realloc, aligned_alloc도 마찬가지로 가로채 주어야 합니다.

질문자ㅑ의 이미지

감사합니다. 혹시 2번에서 말씀해주신 내용들을 찾아보려면 어떤 키워드로 검색해야할까요? 혹은 관련된 책 같은 것들이 있을까요?

익명 사용자의 이미지

어디까지 알고 있는지, 어디까지 알고 싶은지에 따라 다르겠지요.

좋은 컴퓨터공학 입문서 한 권 추천해드리는 게 안전하지 않겠습니까?

https://csapp.cs.cmu.edu/

바라시는 내용은 Section 9.9에 나옵니다만, 이런 내용들을 공부해 본 적이 없다면 책 전체를 공부하는 것을 추천 드립니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.