기술(Tech, IT)/C++

[Tech, C++] Symbol Table (심볼 테이블)

Daniel803 2024. 2. 26. 01:59

Symbol Table은 컴파일러와 링커에서 사용하는 데이터 구조로, 프로그램에서 사용되는 식별자(변수 및 함수 이름 등) 목록과 유형, 범위(가시성), 메모리 위치 등 각 식별자에 대한 정보를 담고 있다. Symbol Table은 컴파일러와 링커가 프로그램 전체에서 이러한 식별자에 대한 참조를 해결하는 데 도움이 된다.

 

디버깅의 맥락에서 디버그 심볼 내의 Symbol Table은 디버거가 메모리 주소 및 기타 로우-레벨 정보를 사람이 읽을 수 있는 식별자에 다시 매핑하는 데 도움이 된다. 이 매핑을 통해 디버거는 변수 값을 표시하고, 코드 한 줄씩 단계별로 살펴보고, 기타 고급 디버깅 기능을 제공할 수 있다.

 

컴파일할 때 Symbol Table은 컴파일러가 각 함수와 변수가 어디에 정의 되어 있고 어떻게 서로 연결되어야 하는지 이해하는 데 도움이 된다. 디버깅 중에 이 테이블을 사용하면 디버거가 변수와 함수가 있는 메모리 주소뿐만 아니라 이름과 코드에서 정의된 위치도 표시하므로 프로그램의 흐름을 쉽게 탐색하고 이해할 수 있다.

 

즉, Debugging Symbols은 컴파일된 바이너리 코드와 원본 소스 코드 사이의 다리 역할을 하여 개발자가 프로그램을 보다 효과적으로 디버깅할 수 있게 해준다. 반면 Symbol Table은 컴파일 및 링크 중에 식별자를 추적하기 위해 사용되는 더 넓은 개념으로, 컴파일된 코드를 소스 코드 식별자에 다시 매핑하는 데 도움을 주어 디버깅 프로세스에서 중요한 역할을 한다.

 

아래와 같은 코드가 있다고 가정하자.

// main.cpp
#include <iostream>

void printMessage() {
    std::cout << "Hello, World!" << std::endl;
}

int main() {
    printMessage();
    return 0;
}

 

컴파일 과정에서 컴파일러는 아래와 같은 Symbol Table을 구성한.

Symbol Type Scope Location
printMessage Function Global main.cpp:3
std::cout Variable External <iostream>
std::endl Function External <iostream>
main Function Global main.cpp:7

 

  • Symbol
    : 함수 또는 변수 이름
  • Type
    : Symbol이 함수, 변수, 클래스 등인지 여부
  • Scole
    : Symbol의 범위(예: 함수가 로컬, 전역, 네임스페이스 내인지)
  • Location
    : Symbol이 정의된 위치. 표준 라이브러리(std::cout, std::endl)과 같은 외부 심볼의 경우 실제 위치는 라이브러리 헤더 또는 바이너리 내에 있을 수도

 

참고

- https://learn.microsoft.com/en-us/visualstudio/debugger/specify-symbol-dot-pdb-and-source-files-in-the-visual-studio-debugger?view=vs-2022

- https://learn.microsoft.com/en-us/visualstudio/debugger/how-to-use-the-call-stack-window?view=vs-2022