프로그래밍언어(144039): 이론 과제-02

학번 : 20021558	성명 : 경규성

1. Visual Studio .NET 2003의 디버깅 툴과 LINUX에서 제공하는 gdb의 주요 사용법을 조사하여 설명하시오.

Visual Studio .NET 2003의 디버깅 툴

“MSDN을 참조하였다.“

Visual Studio 디버거는 프로그램의 런타임 동작을 관찰하고 논리 오류를 찾아낼 수 있는 강력한 도구입니다. 디버거는 모든 Visual Studio 프로그래밍 언어 및 관련 라이브러리와 함께 작동합니다. 디버거를 사용하면 프로그램 실행을 중단하거나 일시 중단하여 코드 검사, 프로그램의 변수 계산 및 편집, 레지스터 보기, 소스 코드로부터 만들어진 명령 보기, 응용 프로그램에 사용된 메모리 공간 확인 등을 수행할 수 있습니다. 편집하며 계속하기 기능을 사용하면 디버깅하는 동안 코드를 변경하고 프로그램을 계속 실행할 수 있습니다.

Visual Studio 디버거에는 디버거 도구에 액세스하기 위한 디버그 메뉴가 있습니다. 디버거 창과 대화 상자에는 프로그램에 대한 정보가 표시되고 여기에 사용자가 직접 추가 정보를 입력할 수도 있습니다. F1 키를 누르면 각 창과 대화 상자에 대한 도움말을 표시할 수 있습니다.

1. 실행 제어

디버거를 사용하여 응용 프로그램의 실행을 제어하는 방법에 대해 설명합니다. 디버거를 사용하면 실행 시작 또는 계속, 실행 중단 및 중지, 응용 프로그램 단계별 실행, 지정한 위치까지 실행, 실행 위치 설정 등을 수행할 수 있습니다.

실행 시작 또는 계속

디버깅을 시작하려면

디버그 메뉴에서 시작을 선택하고 한 단계씩 코드 실행이나 프로시저 단위 실행을 선택합니다.

- 또는 -

소스 창에서 실행 코드 줄을 마우스 오른쪽 단추로 클릭하고 바로 가기 메뉴에서 커서까지 실행을 선택합니다.

시작을 선택하면 응용 프로그램이 시작되고 중단점에 도달할 때까지 실행됩니다. 언제든지 실행을 중단하여 값을 검사하고 변수를 수정할 수 있으며 프로그램의 상태를 검사할 수도 있습니다. 자세한 내용은 실행 중단을 참조하십시오.

한 단계씩 코드 실행이나 프로시저 단위 실행을 선택하면 응용 프로그램이 시작되어 실행되다가 첫째 줄에서 중단됩니다.

커서까지 실행을 선택하면 응용 프로그램이 시작되고 중단점 또는 커서 위치 중 하나에 먼저 도달할 때까지 실행됩니다. 커서 위치는 소스 창에서 설정할 수 있습니다. 중단이 발생하지 않는 경우도 있는데, 이는 커서가 설정되어 있는 코드 위치까지 실행되지 않았다는 것을 뜻합니다.

솔루션에 프로젝트가 하나 이상 포함될 수도 있습니다. 이러한 경우 디버그 메뉴의 실행 명령을 사용하여 시작할 시작 프로젝트를 선택할 수 있습니다. 또는 솔루션 탐색기에서 선택한 프로젝트를 시작할 수 있습니다.

디버그 메뉴의 디버깅하지 않고 시작 명령을 사용하면 디버거를 사용하지 않고 프로젝트를 실행할 수 있습니다.

실행 중단

Visual Studio 디버거를 사용하여 응용 프로그램을 디버깅할 때 응용 프로그램은 실행 중이거나 중단 모드로 설정되어 있습니다. 조사식 창에서 식을 계산하는 기능과 같은 대부분의 디버거 기능은 중단 모드에서만 사용할 수 있습니다.

실행이 중단점에 도달하거나 예외가 발생하면 디버거에서 프로그램 실행을 중단합니다. 자세한 내용은 예외 처리를 참조하십시오. 언제든지 수동으로 실행을 중단할 수 있습니다. 해당하는 소스가 없는 코드를 실행하는 중에 중단할 경우 디스어셈블리 창에서 디버깅할 수 있습니다.

수동으로 프로그램 실행을 중단하려면

디버그 메뉴에서 모두 중단을 클릭합니다.

디버거가 디버거에서 실행되는 모든 프로그램의 실행을 중지합니다. 프로그램은 종료되지 않으므로 언제든지 실행을 다시 시작할 수 있습니다. 디버거와 응용 프로그램은 중단 모드로 설정됩니다.

여러 프로그램을 디버깅하는 경우 중단점 또는 모두 중단 명령은 기본적으로 디버깅 중인 모든 프로그램에 적용됩니다. 현재 프로그램만 중단하려면 이 기본 설정을 변경합니다.

여러 프로그램을 디버깅할 때 중단 동작을 변경하려면

1.도구 메뉴에서 옵션을 클릭합니다.

2.옵션 대화 상자에서 디버깅 폴더를 선택하고 일반 범주를 클릭합니다.

3.한 프로세스가 중단될 때 모든 프로세스 중단을 선택하거나 선택 취소합니다.

4.확인을 클릭합니다.

실행 중지

디버깅을 중지하려면

디버그 메뉴에서 디버깅 중지를 선택합니다.

디버깅 중지는 Visual Studio에서 프로그램을 시작한 경우 디버깅 중인 프로세스를 종료합니다. Visual Studio에서 프로세스를 시작하지 않고 해당 프로세스에 연결한 경우에는 프로세스가 계속 실행됩니다. 연결된 프로세스를 종료하려면 프로세스 창에서 프로세스를 하나씩 종료하거나 모두 종료 명령을 사용하여 연결된 모든 프로세스를 종료합니다.

연결된 모든 프로세스 디버깅을 종료하려면

디버그 메뉴에서 모두 종료를 선택합니다.

현재 디버깅 중인 실행을 중지하고 즉시 새로운 실행을 시작하려면 다시 시작 명령을 사용합니다.

디버깅을 중지하고 다시 시작하려면

디버그 메뉴에서 다시 시작을 선택합니다.

다시 시작은 현재 디버깅 세션을 중지하고 시작 프로젝트를 다시 시작합니다.

디버깅하고 있는 응용 프로그램을 종료하면 디버깅이 자동으로 중지됩니다. 여러 프로그램을 디버깅하는 경우에는 마지막 프로그램이 종료할 때까지 디버깅이 계속됩니다. 예를 들어, Internet Explorer에서 호스팅하는 웹 프로젝트처럼 다른 응용 프로그램에서 호스팅하는 프로젝트를 디버깅하는 경우, Microsoft Internet Explorer와 같은 호스트 응용 프로그램을 종료하면 디버깅이 중지됩니다.

Visual Basic과 C#의 경우, 웹 서비스를 디버깅하는 중에 해당 서비스를 사용하는 클라이언트 응용 프로그램이 종료되면 웹 서비스의 디버깅이 중지됩니다.

응용 프로그램 단계별 실행

가장 일반적인 디버깅 방법 중 하나는 한 번에 한 줄씩 코드를 실행하는 단계별 실행입니다.

디버그 메뉴에서는 단계별 코드 실행에 사용하는 세 가지 명령을 제공합니다.

- 한 단계씩 코드 실행

- 프로시저 단위 실행

- 프로시저 나가기

한 단계씩 코드 실행과 프로시저 단위 실행은 함수 호출 처리 방법만 다릅니다. 두 가지 명령 모두 디버거에서 다음 코드 줄을 실행하도록 지시합니다. 코드 줄에 함수 호출이 포함되어 있는 경우 한 단계씩 코드 실행은 호출 자체만 실행한 다음 함수 안에 있는 코드의 첫째 줄에서 중단합니다. 프로시저 단위 실행은 전체 함수를 실행한 다음 함수 외부의 첫째 줄에서 중단합니다. 함수 호출 내부를 확인하려면 한 단계씩 코드 실행을 사용합니다. 함수를 한 단계씩 실행하지 않으려면 프로시저 단위 실행을 사용합니다.

중첩된 함수 호출인 경우 한 단계씩 코드 실행 명령은 가장 안쪽에 중첩된 함수를 한 단계씩 실행합니다. Func1(Func2())와 같은 호출에 한 단계씩 코드 실행을 사용하면 디버거에서 함수 Func2를 한 단계씩 실행합니다.

네이티브 코드에서 중첩된 특정 함수를 한 단계씩 실행하려면 바로 가기 메뉴의 한 단계씩 코드 실행 명령을 사용합니다. 관리 코드를 디버깅하는 경우에는 이 명령을 사용할 수 없습니다. 자세한 내용은 방법: 특정 함수의 코드를 한 단계씩 실행을 참조하십시오.

함수 호출 내부에서 호출한 함수로 돌아가려면 프로시저 나가기를 사용합니다. 프로시저 나가기는 함수가 반환될 때까지 코드 실행을 계속한 다음 호출 함수의 반환점에서 중단합니다.

지정한 위치까지 실행

중단점을 설정한 특정 위치까지 실행하려면

디버그 메뉴에서 시작 또는 계속을 클릭합니다.

그러나 중단점을 설정할 필요가 없는 경우도 있습니다. Visual Studio 디버거에서는 특정 명령을 통해 커서 위치나 지정한 함수까지 실행할 수 있습니다. 자세한 내용은 방법: 커서 위치까지 실행 및 방법: 지정한 함수까지 실행을 참조하십시오.

실행 위치 설정

-SQL 디버깅에는 이 기능을 사용할 수 없습니다.

Visual Studio 디버거에서 다음에 실행할 코드의 문으로 실행 위치를 이동할 수 있습니다. 소스 또는 디스어셈블리 창의 여백에 있는 노란색 화살표는 다음에 실행할 문의 위치를 나타냅니다. 코드의 일부를 건너뛰거나 이전에 실행한 줄로 돌아가려면 이 화살표를 이동합니다. 알려진 버그를 포함하는 코드 섹션을 건너뛰려는 경우 등에 이 방법을 사용할 수 있습니다.

주의 다음 문을 설정하면 프로그램 카운터가 새 위치로 바로 이동하게 됩니다. 이 명령은 주의해서 사용해야 합니다.

기존 실행 위치와 새 실행 위치 사이에서는 명령이 실행되지 않습니다.

실행 위치를 뒤로 이동하면 그 사이에서 실행된 명령이 실행 취소되지 않습니다.

다음 문을 다른 함수나 범위로 이동하면 호출 스택이 손상되어 런타임 오류나 예외가 발생할 수 있습니다. 다음 문을 다른 범위로 이동하려고 하면 디버거에서 대화 상자가 열리고 여기서 작업을 취소할 수 있습니다. Visual Basic의 경우 다음 문을 다른 범위나 함수로 이동할 수 없습니다.

네이티브 C++에서 런타임 검사를 활성화한 경우 다음 문을 설정하면 실행이 메서드의 끝에 도달할 때 예외가 throw될 수 있습니다.

2. 방법: 숨겨진 디버거 명령 복원

IDE 기본 설정에 따라 숨겨진 디버거 명령을 표시하는 방법에 대해 설명합니다.

Visual Studio를 설치할 때 주 프로그래밍 언어의 기본 IDE 설정 집합을 선택하는 단계가 있습니다. 일부 언어의 기본 IDE 설정에서는 특정 디버거 명령이 표시되지 않을 수 있습니다.

기본 IDE 설정에 따라 숨겨진 디버거 기능을 사용하려면 다음 절차를 사용하여 명령을 메뉴에 다시 추가해야 합니다.

숨겨진 디버거 명령을 복원하려면

1. 프로젝트가 열려 있는 상태에서 도구 메뉴의 사용자 지정을 클릭합니다.

2. 사용자 지정 대화 상자에서 명령 탭을 클릭합니다.

3. 범주 상자에서 디버그를 선택합니다.

4. 명령 상자에서 추가하려는 명령을 선택하여 디버그 메뉴에 끌어서 놓습니다.

5. 다른 명령을 추가하려면 위 단계를 반복합니다.

6. 필요한 명령을 모두 메뉴에 추가한 다음 닫기를 클릭합니다.

사용자 지정 대화 상자에서 사용할 수 없는 명령 복원

특히 계층 구조 메뉴에 있는 명령과 같은 일부 명령은 사용자 지정 대화 상자에서 복원할 수 없습니다. 이러한 명령을 복원하려면 IDE 설정의 새 컬렉션을 가져와야 합니다.

# 새 IDE 설정을 가져오려면

1. 도구 메뉴에서 설정 가져오기 및 내보내기를 선택합니다.

2. 설정 가져오기 및 내보내기 마법사 시작 페이지에서 선택한 환경 설정 가져오기를 클릭하고 다음을 클릭합니다.

3. 현재 설정 저장 페이지에서 기존의 설정을 저장할지 여부를 결정하고 다음을 클릭합니다.

4. 가져올 설정 모음을 선택하십시오. 페이지의 기본 설정 폴더 아래에서 필요한 명령이 들어 있는 개발 설정의 컬렉션을 선택합니다. 어떠한 컬렉션을 선택해야 할지 알 수 없으면 대부분의 디버거 명령을 제공하는 일반 개발 설정이나 Visual C++ 개발 설정을 선택합니다.

5. 다음을 클릭합니다.

6. 가져올 설정을 선택하십시오. 페이지의 옵션 아래에서 디버깅을 선택합니다. 함께 가져오려는 설정이 아닌 다른 모든 설정의 확인란은 선택을 해제합니다.

7. 마침을 클릭합니다.

8. 설정을 다시 설정하는 데 관련된 오류가 있으면 가져오기 완료 페이지의 자세히 아래에서 해당 정보를 검토합니다.

9. 닫기를 클릭합니다.

3, 스레드 및 프로세스 작업

프로세스 및 스레드에 연결하고 그 실행을 제어하는 방법에 대해 설명합니다.

4. Just-In-Time 디버깅

Visual Studio의 외부에서 실행하는 동안 프로그램이 충돌할 때 자동으로 디버거를 시작할 수 있는 Just-In-Time 디버깅에 대해 설명합니다.

5. 자동으로 디버거 실행

Windows에서 응용 프로그램을 시작할 때 Visual Studio가 시작되도록 응용 프로그램을 설정하는 지침을 제공합니다. Visual Studio가 응용 프로그램을 로드하여 디버깅 준비를 하지만 디버깅은 실행 명령이 발행되어야 시작됩니다. 디버거를 시작하는 이러한 방법은 서비스 및 COM out-of-process 서버를 디버깅하는 데 유용합니다.

6. 연습: 디자인 타임에 디버깅

응용 프로그램이 실행되지 않을 때 Visual Studio 직접 실행 창을 사용하여 함수나 서브루틴을 실행하는 방법을 보여 줍니다.

7. 덤프

저장 및 열기에 대한 지침을 포함하여 덤프 파일에 대해 설명합니다. 덤프 파일에는 일정한 시점(대개 충돌 이후)의 프로그램 상태에 대한 스냅샷이 포함됩니다. 소스 파일이나 PDB가 설치되어 있지 않은 컴퓨터에서 프로그램을 테스트하는 경우 충돌이 발생하면 덤프 파일을 저장하고 소스 파일과 PDB가 있는 빌드 컴퓨터에서 이 덤프 파일을 사용하여 충돌을 디버깅할 수 있습니다.

8. 중단점 및 추적점

중단점과 추적점의 개념을 정의하고 이를 사용하는 방법에 대해 설명합니다.

9. 디버거에서 데이터 보기

프로그램의 상태를 검사하고 수정할 수 있는 여러 가지 디버깅 도구에 대한 정보를 제공합니다. 이러한 도구의 대부분은 중단 모드에서만 작동합니다.

10. 디버거에서 사용하는 식

디버거에 C++, C#, C++, Visual Basic, J# 및 스크립트 식을 입력할 때 사용할 수 있는 언어별 구문에 대해 설명하는 항목의 링크를 제공합니다.

11. 예외 처리

예외, 디버거에서 예외를 처리하는 방법, 처리를 변경하는 방법, 예외가 발생한 위치를 보는 방법, 변수 내용을 보는 방법, 관리 코드에서 처리되지 않은 예외에 대한 제한, 네이티브(C++) 코드에서 예외 해결 등에 대해 설명합니다.

12. 편집하며 계속하기

프로그램이 중단 모드에 있는 동안 소스 코드를 변경할 수 있으며, 디버그 세션을 종료하고 프로그램을 다시 빌드하지 않고도 변경 내용을 적용할 수 있도록 해 주는 도구인 편집하며 계속하기에 대해 설명하고, 이 기능을 활성화/비활성화하는 방법을 소개합니다.

"Visual Studio의 디버거 사용법인 “디버거 로드맵”은 내용이 워낙 방대하여 처음 간단한 사용법만 본 과제에 적고 나머지는 목차와 설명만 적었다.

GDB 사용법

gdb 실행

$ gdb [prog [core|procID]]

≫    prog: 디버깅할 프로그램

≫    core: 프로그램 실행 중에 “segmentation fault” 등의 오류에 의해 비정상적으로 종료할 때 생성되는 파일로, 그때의 시스템의 내부 상태를 그대로 저장해 놓은 것이다. 이 파일을 인자로 주면 실행파일이 비정상적으로 종료된 곳이 소스코드의 어느 부분인지를 표시해 준다.

≫    procID: 이미 실행중인 프로그램을 debugging하려면 해당 process의 id (PID)를 주면 되는데, 이 때 주의 할 것은 PID와 같은 이름의 파일이 있을 경우 gdb가 core파일로 여기게 되는 점이다.

주의: Debugging하고자 하는 실행파일은 gcc에서 –g 옵션을 주어 compile함으로써 gdb가 필요로 하는 부가 정보들이 추가된 것을 사용해야 제대로 debugging을 수행할 수 있다.

gdb 명령어

gdb를 실행하여 gdb prompt ‘(gdb) ’가 표시된 상태에서 gdb 명령어를 사용하여 디버깅을 진행한다.

참고: class와 command의 축약형도 지원된다. (예, ‘run’명령어를 축약형 ‘r’로 대신할 수 있다.)

≫    도움말 (help)

help [class|command]

도움말, 명령어 분류 목록 출력, 해당 class에 속한 명령어 목록 표시, 해당 command에 대한 도움말 표시

≫    프로그램 수행 (running)

kill

디버깅 중인 프로그램의 실행을 강제로 종료시킨다.

run [args]

디버깅할 프로그램의 수행을 시작한다. 프로그램 실행에 필요한 argument (args)를 지정할 수 있다. args를 지정하지 않으면 바로 이전의 run실행이나 “set args”명령에 의해 미리 주어진 argument를 사용한다. 입출력 방향 재지정 (“>”, “<”, “>>”)을 사용할 수 있다.

set args [args]

프로그램이 시작될 때, 디버깅할 프로그램에 전달할 argument를 설정한다.

next [n]

멈춰진 프로그램에서 프로그램의 다음 n(default=1)개의 문장을 수행한 후 멈춘다. 함수일 경우, 함수 전체를 수행한다.

step [n]

멈춰진 프로그램에서 프로그램의 다음 n(default=1)개의 문장을 수행한 후 멈춘다. 함수일 경우, 함수 내부로 들어가 한 문장씩 수행한다.

continue [n]

시그널(Ctrl-C)이나 breakpoint 등에 의해 멈춰진 프로그램의 수행을 계속한다. n이 지정될 경우, 이후 n-1번의 breakpoint는 무시하고, n번째 breakpoint에서 수행을 멈춘다.

until [[file:]n|function]

프로그램이 현재 라인보다 큰 라인이나 또는 지정된 라인이나 어드레스 또는 함수에 도달할 때까지 수행한다(break 명령과 동일한 argument). 또한, 현재 stack frame을 빠져나올 때도 멈춘다. loop를 지날 때, 첫번째 loop수행에서는 next명령과 동일하지만 두번째 loop수행부터는 그 loop를 벗어날 때까지 멈추지 않는다.

≫    스택 검사 (stack)

스택은 스택 프레임으로 구성된다. gdb는 스택 프레임에 번호를 지정하는데, 가장 안쪽에 있는(현재 실행중인) 프레임에 대해 0번부터 번호를 부여한다. gdb는 항상 한 프레임을 선택된 프레임으로 간주하며, 선택된 프레임에 대하여 변수 값 보기가 이루어진다. 아래 명령어들에서 숫자나 어드레스를 사용하여 다른 프레임을 지정할 수도 있다.

bt (또는 backtrace 또는 where) [[-]N]

모든 스택 프레임이나 가장 안쪽에 있는 N개의 프레임에 대한 backtrace를 출력한다. argument가 음수(-N)일 때, 가장 바깥쪽에 있는 N개의 프레임을 출력한다.

frame [N]

스택 프레임을 선택하고 출력한다. N은 선택할 프레임 번호(혹은 프레임의 주소)를 가리킨다. Argument가 없으면 현재 선택된 프레임을 출력한다.

up [N]

현재 선택된 프레임을 호출한 스택 프레임 (caller)을 선택하고 출력한다. N은 몇 개의 프레임 위로 올라가야 할지를 말해준다.

down [N]

현재 선택된 프레임에 의해 호출된 스택 프레임 (callee)을 선택하고 출력한다. N은 몇 개의 프레임 아래로 내려가야 할지를 말해준다.

return [rvalue]

선택된 스택 프레임으로 하여금 호출자 (caller)에게로 리턴하게 한다. 실행은 현재 선택된 것보다 위에 있는 프레임 (caller)에서 계속될 것이다. rvalue는 리턴 값을 지정한다.

set variable [variable] = [exp]

[variable]의 값을 [exp] 계산 결과로 대치한다. set variable 대신 set만 써도 된다.

≫    데이터 검사 (data)

whatis EXP

expression EXP의 data 타입을 출력한다.

ptype TYPE

타입 TYPE의 정의를 출력한다.

print [EXP]

expression EXP의 값을 출력한다. EXP에 사용될 수 있는 변수는 선택된 프레임에 있는 변수이거나 전역 변수이다.

printf  [“format string”, arg1, arg2, arg3, ..., argn]

printf 형식으로 출력한다.

display [EXP]

expression EXP의 값을 프로그램이 멈출 때마다 출력한다.

delete display (또는 undisplay) [N …]

프로그램이 정지할 때마다 출력되는 몇몇 expression을 취소한다. N은 취소할 expression의 번호를 지정한다. Argument가 없으면 모든 자동 출력 expression을 취소한다.

disable display [N …]

프로그램이 정지할 때마다 출력되는 몇몇 expression을 disable한다. N은 disable할 expression의 번호를 지정한다. Argument가 없으면 모든 자동 출력 expression을 disable한다.

enable display [N …]

프로그램이 정지할 때마다 출력되는 몇몇 expression을 enable한다. N은 enable할 expression의 번호를 지정한다. Argument가 없으면 모든 자동 출력 expression을 enable한다.

≫    특정 지점에서 프로그램 정지 (breakpoints)

watch [EXP]

expression EXP에 대한 watchpoint를 설정한다. EXP의 값이 변할 때마다 프로그램의 수행을 멈춘다.

break [[file:]n|function]

특정 라인(n)이나 함수(function)에 breakpoint를 설정한다. Argument가 없으면 현재 수행 위치에 breakpoint를 설정한다. 프로그램이 수행 중에 지정된 breakpoint에 도착하면 수행을 멈춘다.

clear [[file:]n|function]

특정 라인(n)이나 함수(function)에 설정된 breakpoint를 제거한다. Argument가 없으면 현재 수행 위치에 설정된 모든 breakpoint를 제거한다.

delete [N …]

몇몇 breakpoint나 자동 출력 expression을 제거한다. N은 제거할 breakpoint 번호를 가리킨다. Argument가 없으면 모든 breakpoint를 제거한다.

disable [N …]

몇몇 breakpoint를 disable시킨다. N은 disable할 breakpoint를 가리킨다. Argument가 없으면 모든 breakpoint를 disable시킨다. disable된 breakpoint는 enable에 의해 다시 동작하도록 할 수 있다.

enable [N …]

몇몇 breakpoint를 enable시킨다. N은 enable할 breakpoint를 가리킨다.

condition [N  COND]

breakpoint N에서 COND가 true일 때만 멈추도록 명시한다.

≫    검사할 파일 (files)

cd [DIR]

작업 디렉토리를 DIR로 설정한다

pwd

작업 디렉토리를 출력한다.

core-file [FILE]

FILE을 core dump 파일로 사용한다.

file [FILE]

FILE을 디버깅할 프로그램으로 사용한다.

list [[file:]n|function][, [file:]n|function]

지정된 함수나 라인 앞뒤의 11라인을 출력한다. 콤마로 분리된 두 개의 Argument는 출력할 시작 라인과 끝 라인을 가리킨다. Argument가 없으면 앞서 출력된 라인 이후의 10개 라인을 출력한다. “list –”는 앞서 출력된 라인 이전의 10개 라인을 출력한다.

≫    상태 조회 (status)

info

디버깅 중인 프로그램에 대한 여러가지를 보여 주기 위한 포괄적인 명령어

info breakpoints (또는 info watchpoints) [N]

설정된 breakpoint의 상태를 보여준다. N은 특정 breakpoint 번호를 가리킨다. Argument가 없으면 모든 breakpoint의 상태를 보여 준다.

info args

현재 스택 프레임의 인자 변수를 보여준다.

info display

프로그램이 멈출 때 출력할 expression들을 보여준다.

≫    지원도구 (support)

help [class|command]

도움말, 명령어 분류 목록 출력, 해당 class에 속한 명령어 목록 표시, 해당 command에 대한 도움말 표시

quit

gdb를 종료한다.

make [args]

‘make’를 실행한다.

2. 다음 C 프로그램의 실행 결과를 보이고, 그 이유에 대해서 선행처리기(매크로)를 중심으

로 설명하시오.

#include <stdio.h>

#define P(z) printf("z is %d\n",z)

#define S1(X) X*X

#define S2(X) (X)*(X)

#define S3(X) (X*X)

int main(void)

{

int x=4, z;

z = S1(x); P(z);

z = S1(x+1); P(z);

z = S2(x); P(z);

z = S2(x+1); P(z);

z = 100/S1(2); P(z);

z = 100/S3(2); P(z);

return 0;

}

>1. 실행결과

>2. 설명

선행처리기(Preprocess)와 매크로란,

-프로그램이 컴파일 되기 전에 source파일에 대한 작업을 행하는 것으로 main() 함수보다 미리 처리된다고 하여 선행처리기라 합니다.

#define P(z) printf("z is %d\n",z)

#define S1(X) X*X

#define S2(X) (X)*(X)

#define S3(X) (X*X)

위 코드에서 이미 P(z), S1(X), S2(X), S3(X)를 정의하여 함수처럼 가져다 쓰면됩니다.

int x=4, z; // 변수 정의

z = S1(x); P(z); // 4*4=16

z = S1(x+1); P(z); // 5*5=25

z = S2(x); P(z); // (4)*(4)=16

z = S2(x+1); P(z); // (5)*(5)=25

z = 100/S1(2); P(z); // 100 / 2 * 2 = 100

z = 100/S3(2); P(z); // 100 / (2*2) = 25

3. 다음 PROLOG 프로그램의 실행결과를 예측하시오.

thief(john).

likes(mary,food).

likes(mary,wine).

likes(john,money).

likes(john,X) :- likes(X,wine).

may_steal(X,Y) :- thief(X), likes(X,Y).

?- may_steal(john,X)

thief(john).

존은 도둑이다

likes(mary,food).

매리는 음식을 좋아한다.

likes(mary,wine).

매리는 와인을 좋아한다.

likes(john,money).

존은 돈을 좋아한다.

likes(john,X) :- likes(X,wine).

와인을 좋아하는 모든 X는

존이 좋아하는 X이다.

may_steal(X,Y) :- thief(X), likes(X,Y).

X가 도둑이고, X가 Y를 좋아면

X가 Y를 훔칠 것이다.

?- may_steal(john,X)

존이 X를 훔칠까?

실행결과...

YES...

4. 다음 개념들을 조사하여 정리하시오.

- .NET Framework

- JIT compilation

- MSIL (Microsoft Intermediate Language)

- CLR (Common Language Runtime)

>>>>> .NET Framework

현재 가장 많이 사용되고 있는 운영체제는 마이크로소프트의 윈도우이다. 이런 윈도우 어플리케이션을 개발을 위해 지금까지 Visual Basic이나 Visual C++와 같은 개발툴을 사용해왔다. 그러나 윈도우 환경에서의 프로그래밍 방식이 인터넷 환경이 보편화됨으로 여러 가지 문제점들이 나타나게 되었다. 이런 문제들을 해결하기 위한 새로운 프레임워크를 발표하게 된 것이다.

현재의 인터넷 환경에서의 웹 어플리케이션 개발을 위해서 기존의 윈도우 API에 의한 개발방법으로는 많은 문제점이 발생한다. 또한 기존의 어플리케이션들을 통합해야만 보다 확장성이 있는 프로그래밍이 가능하게 되었다. 이런 문제점들을 인식하여 XML을 채택하여 데이터를 통합할 수 있는 진정한 분산 어플리케이션을 작성할 수 있는 새로운 개발 플랫폼이 .NET Framework이다.

.NET 프레임워크의 구조를 살펴보자. .NET 프레임워크의 핵심은 Common Language Runtime이다. 지금까지 대부분의 개발언어(Visual Basic, Visual C++에서 런타임 라이브러리는 신속하고 원활한 어플리케이션 개발을 지원하였다. 이와 마찬가지로 .NET 프레임워크에서도 런타임 라이브러리를 제공하게 되는데 이것이 Common Language Runtime인 것이다. (CLR 아래설명)

>>>>> JIT compilation

자바 프로그램 언어 환경에서, JIT 컴파일러는 자바 바이트코드 (반드시 해석되어야만 하는 명령어를 포함한 프로그램)를, 프로세서에게 직접 전달될 수 있는 명령어로 바꾸어주는 프로그램이다. 하나의 자바 프로그램을 작성하고 나면, 소스 문장은 자바 컴파일러에 의해 바이트코드로 변환되는데, 이는 특정 하드웨어 플랫폼의 프로세서(예를 들면, 인텔의 펜티엄 마이크로프로세서, 혹은 IBM의 System/390 프로세서 등)에 맞는 명령어를 포함한 코드가 아니라, 어떤 플랫폼에도 인식되고, 실행 가능한, 플랫폼에 독립적인 코드이다. 과거에는, 특정 언어로 쓰여진 대부분의 프로그램들이 반드시 각각의 컴퓨터 플랫폼에 맞게 다시 컴파일 되어져야 했고, 경우에 따라서는 다시 작성되어야 하는 경우도 있었다. 자바의 가장 큰 장점은, 프로그램 작성과 컴파일을 단 한번만 하면 된다는 것이다. 한 플랫폼의 자바 가상머신은 컴파일된 바이트코드를 특정 프로세서가 인식할 수 있는 명령어로 해석한다. 그러나, 가상머신은 한번에 한 개의 바이트코드 명령어만을 다룰 수 있다. 특정 시스템 플랫폼에 있는 JIT 컴파일러 (실제로 2번째 compiler)를 사용하여, 바이트코드를 특정 시스템의 코드로(마치 그 프로그램이 처음부터 그 플랫폼에서 컴파일된 것처럼) 컴파일할 수 있다. 코드가 일단 JIT 컴파일러에 의해 (다시) 컴파일되면, 대체로 그 컴퓨터에서 더 빠른 속도로 실행된다. JIT 컴파일러는 가상머신과 함께 제공되며, 사용 여부는 선택에 달려있다. 이것은 바이트코드를 특정 플랫폼에 딱 맞아서, 즉시 실행 가능한 코드로 컴파일 한다. 썬 마이크로시스템즈는, 특히 실행 가능한 메쏘드가 반복적으로 재사용될 경우에, JIT 컴파일러를 선택하는 것이 대체로 빠르다고 말하고 있다.

>>>>> MSIL (Microsoft Intermediate Language)

닷넷(.Net) 플랫폼에서 생성되는 중간 언어. 닷넷 프레임워크에서 다양한 언어의 코드를 컴파일하면 마이크로소프트 중간 언어(MSIL)가 생성되는데, 이는 시스템의 중앙 처리 장치(CPU) 환경에서 실행 가능한 코드로 변하기 이전의 코드로, CPU 처리 명령(산술, 논리 연산 등)뿐만 아니라 객체에 대한 명령들로 이뤄져 있다. MSIL을 실행하기 위해서는 JIT(Just-In-Time) 컴파일러를 사용해 기계어로 변환해야 하며, 기계어로의 변환은 CPU에서 수행되므로 응용 프로그램의 속도와 밀접한 관계가 있고, 한번 기계어로 번역된 코드를 기억하고 있어서 다시 실행할 경우에는 번역 과정을 거치지 않고 바로 기계어를 실행한다.

>>>>> CLR (Common Language Runtime)

CLR은 마이크로소프트의 .NET 프레임웍의 일부로서, 지원되는 언어 중 어떤 하나로 작성된 프로그램이 공통의 객체지향형 클래스를 공유할 수 있도록 해주는 실행 관리 프로그램이다. CLR은 자바 언어로 컴파일된 프로그램을 실행시키기 위해 썬 마이크로시스템즈가 제공하는 자바 가상머신에 어느 정도 비교될만하다.

마이크로소프트는 자사의 CLR을 하나의 "관리 실행 환경"이라고 지칭한다. CLR용으로 컴파일된 프로그램은 반드시 해당 언어 고유의 실행 환경만을 고집하지 않으며, 윈도우2000이나 윈도우XP가 돌아가는 시스템이라면 어디서라도 실행될 수 있다. 비주얼 베이직, 비주얼 C++ 또는 C# 언어를 쓰는 프로그래머들이 자신들의 프로그램을 이식 가능 실행 파일 내에서 CIL이라는 중간 형태의 코드로 컴파일하고 나면, 이를 CLR을 통해 관리하고 실행시킬 수 있다. 프로그래머가 컴파일할 때 그에 관한 서술적 정보를 지정하면, 이 정보는 컴파일된 프로그램과 함께 메타데이터로서 저장된다. 컴파일된 프로그램 내에 저장된 메타데이터는, 사용된 언어의 종류와 버전, 그리고 그 프로그램에 필요한 클래스 라이브러리는 무엇인지 등에 관한 정보를 CLR에게 알려 준다. CLR은 한 언어로 작성된 클래스의 인스턴스가 다른 언어로 작성된 클래스의 메쏘드를 호출할 수 있게 해주며, 자투리 모으기와 예외 처리 및 디버깅 서비스 등도 제공한다.