코드 커버리지(Code Coverage)

고성용 이사 / IAR 시스템즈
Sung-Yong.Ko@iar.com


C-SPY® 의 코드 커버리지 기능을 설명한다.
코드의 모든 부분이 실행되었는지 여부를 확인하는 데 유용하게 사용할 수 있다.

코드 커버리지 소개

1. 코드 커버리지를 사용하는 이유
테스트 절차를 설계할 때 코드의 모든 부분이 실행되었는지 여부를 확인하는 데 코드 커버리지 기능은 유용하다. 또한 실행되지 않는 코드의 부분을 식별하는 데도 도움이 된다.
2. 코드 커버리지에 대한 요약
코드 커버리지 윈도우는 현재 코드분석의 상태를 표시한다. 모든 프로그램, 모듈, 그리고 함수에 대하여 표시하며, 코드 커버리지 기능이 시작되고 응용프로그램이 멈출 때까지 실행되었던 코드의 실행비율을 분석하여 보여준다.
또한, 실행되지 않은 모든 문장도 나열된다. 코드 커버리지가 해제될 때까지 분석은 계속 진행된다.
3. 코드 커버리지를 사용하기 위한 요구사항
사용중인 드라이버에 대한 자세한 내용은 다음의 C-SPY 드라이버의 차이점을 참조하자.
C-SPY 드라이버의 차이점은 표 1을 참조한다. 표 1은 시뮬레이터, I-jet/JTAGjet, J-Link/J-Trace, 그리고 ST-LINK 사이의 주요 차이점을 요약한 것이다.




표 1.
드라이버의 차이, I-jet/JTAGjet, J-Link/J-Trace와 ST-LINK


그림 1.
코드 커버리지 윈도우


그림 2.
코드 커버리지 윈도우 컨텍스트 메뉴


표 2.
코드 커버리지 활성화를 위한 프로젝트 옵션



코드 커버리지에 대한 참조정보

코드 커버리지와 관련된 윈도우 및 대화상자에 대한 참조정보를 제공한다.

1. 코드 커버리지 윈도우(Code Coverage window)
코드 커버리지 윈도우는 View 메뉴에서 사용할 수 있다.
그림 1의 창은 현재 코드 커버리지 분석의 상태를 표시한다. 모든 프로그램, 모듈과 함수에 대해 코드 커버리지의 기능이 실행되고 응용프로그램이 멈출 때까지 실행된 코드의 비율을 분석내용에서 보여준다. 또한 실행되지 않은 문장들도 나열되어 있다. 분석작업은 기능을 해제할 때까지 계속된다.
제목 표시줄에 별표 (*)는 C-SPY에서 지속적으로 실행을 했고, 표시된 정보가 변경되지 않아 코드 커버리지 윈도우가 갱신되어야 함을 표시한다. 정보를 업데이트하려면 Refresh 명령을 사용하자.

- 코드 커버리지를 사용하려면:
◆ 코드 커버리지 기능을 사용하기 전에 응용프로그램을 표 2에 나와 있는 옵션을 사용하여 빌드해야 한다.
응용프로그램을 빌드한 후 C-SPY를 시작하고 코드 커버리지 윈도우를 열기 위해 View>Code Coverage를 선택한다(표 2 참조).
◆ 활성화(Activate) 버튼을 클릭한다. 다른 방법으로는 코드 커버리지를 활성화하기 위해 컨텍스트 메뉴에서 활성화를 선택한다.
◆ 응용프로그램을 실행한다. 실행이 중지되면, 예를 들어 프로그램이 종료되거나 중단점이 트리거되었기 때문으로 코드 커버리지 정보를 보기 위해 Refresh 버튼을 클릭하자.

- 요구사항
다음의 드라이버 중 하나를 사용해야 한다.
◆ The C-SPY Simulator.
◆ The C-SPY I-jet/JTAGjet driver
◆ The C-SPY J-Link//J-Trace driver
◆ The C-SPY ST-LINK driver

- 표시영역
코드 커버리지 정보는 프로그램, 모듈, 함수, 그리고 문장수준을 보여주는 트리구조로 표시된다. 이 윈도우에는 디버그 정보와 함께 컴파일된 소스코드만을 표시한다.
따라서, startup 코드, exit 코드 및 라이브러리 코드는 이 윈도우에서 표시되지 않는다. 또한, 인라인 함수의 문장에 대한 커버리지 정보도 표시되지 않는다. 단지 인라인 함수 호출을 포함하는 문장만이 실행된 것으로 표시된다. 더하기 기호와 빼기 기호 아이콘은 구조를 확장 또는 축소할 수 있다.

- 아이콘은 모든 수준에 대한 현재 상태를 요약한 내용이다.
적색 다이아몬드: 모듈 또는 함수의 실행이 0%인 것을 의미한다.
녹색 다이아몬드: 모듈 또는 함수의 실행이 100%인 것을 의미한다.
적색과 녹색 다이아몬드: 모듈 또는 함수의 실행이 일부인 것을 의미한다.
노란색 다이아몬드: 실행되지 않은 문을 의미한다.

모든 프로그램, 모듈, 그리고 함수라인의 끝에 표시되는 비율은 지금까지 적용되었던 문장의 양을 보여준다. 즉, 전체 문장의 수로 실행된 문장의 수를 나눈 값이다.
실행되지 않은 문에 대해(노란색 다이아몬드), 표시되는 정보는 소스 윈도우에서 문장의 열  번호범위와 행 번호다. 그리고 단계지점의 주소가 다음에 표시된다.

-:row address.

문은 그 명령어 중 하나가 실행되었을 때 실행되는 것으로 간주된다. 문이 실행되면, 이 창에서 제거되며 비율은 대응하여 증가한다.
코드 커버리지 창에서 문장 또는 함수를 두 번 클릭하면 소스창에서 현재 위치로 문장 또는 함수가 표시되며, 활성화창이 된다. 프로그램 수준에서 모듈을 두 번 클릭하면 트리구조로  확장 또는 축소한다.

- Context menu
그림 2와 같은 컨텍스트 메뉴를 사용할 수 있다. 그리고 컨텍스트 메뉴에서 다음의 명령을 사용할 수 있다.
① Activate(활성화): 실행하는 동안 켜고 코드범위를 전환한다.
② 지움(Clear): 코드 커버리지 정보를 삭제한다. 모든 단계포인트(step point)는 실행하지 않음으로 표시된다.
③ 새로고침(Refresh): 코드 커버리지 정보를 업데이트하고 윈도우를 새로 고쳐 표시한다. 마지막 새로고침 이후 실행된 모든 단계포인트는 트리에서 제거된다.
④ 자동새로고침(Auto-refresh): 코드 커버리지 정보의 자동새로고침을 키거나 끈다. 기능을 활성화하면, C-SPY가 브레이크 포인트에서, 단계포인트에서, 그리고 프로그램 종료에 멈추는 경우 코드 커버리지 정보는 자동으로 다시 로드된다.
⑤ 다른이름으로저장(Save As): 텍스트 파일 형태로 현재 코드 커버리지 결과를 저장한다.
⑥ 세션저장(Save session): 코드 커버리지 세션 데이터를 *.dat 파일로 저장한다. 어떤 이유로 디버그 세션을 중지해야 하지만, 나중에 이 세션을 계속 하려는 경우에 유용하다. 이 명령은 도구모음에서 사용할 수 있다.
⑦ 세션복원(Restore session): 이전에 저장한 코드 커버리지 세션 데이터를 복원한다. 어떤 이유로 디버그 세션을 중지해야 했지만, 나중에 이 세션을 계속하려는 경우에 유용하다. 이 명령은 도구모음에서 사용할  수 있다.

2. 싱글스테핑(Single Stepping)
라인 지향적(line-oriented)이 아니라 문장 지향적이기 때문에 C-SPY는 대부분의 다른 디버거보다 더 세밀하게 스테핑을 할 수 있다. 컴파일러는 각 문장과 함수호출에 대해 단계포인트(step points) 형식으로 자세한 스테핑 정보를 생성한다.
즉, step into나 step over 명령을 실행하든 고려하는 곳으로 소스코드가 위치한다. 단계포인트가 각 문장뿐만이 아니라 함수호출에도 위치되기 때문에 스텝기능은 단순히 문장만 스텝핑하는 것보다 미세하게 진행할 수 있다.

- Autostep 설정대화(예제 1)
상자를 사용하면 단일 스테핑을 자동적으로 할 수 있다. 응용프로그램에 일반적으로 한 스텝씩 진행하는 부분으로 실행되는 코드의 밖으로 나가는 예외가 포함되어 있으면, C-SPY는 catch 명령문에서 진행을 중단한다. 예제 1은 이전단계에서 f(i)함수호출 (강조표시)로 이동했다고 가정한다.

예제 1.
 

- Step Into(예제 2)
스테핑 동안 일반적으로 함수 안으로 들어가거나 함수 또는 서브루틴 안에서 스테핑을 계속할지 여부를 고려한다.
Step Into 명령은 서브루틴g(n-1) 안으로 처음 단계포인트로 이동한다. Step Into 명령은 동일한 또는 다른 함수에 있는지 여부와 관계없이 정상적인 제어의 흐름에서 다음 단계지점으로 실행한다.

예제 2.


- Step Over(예제 3)
Step Over 명령은 호출된 함수 안에서 멈추지 않고 동일한 함수에서 다음 단계지점으로 실행한다. 이 명령으로 g(n-2)라는 함수로 이동한다. g(n-1)과 같은 문장의 부분이지만 그 자체문장은 아니다. 따라서, 문장의 일부분이고 중요 부분에 중점을 두는 대신 관심이 없는 호출에 대해서는 생략할 수 있다(예제 3 참조).

예제 3.
 

- Next Statement(예제 4)
Next Statement 명령은 예제 4와 같이 직접 실행하며, 이번의 경우에는 return value로 빠른 스테핑을 제공한다.

예제 4.
 

- Step Out(예제 5)
함수 안에서 있는 경우, 원하면 종료(exit)에 도달하기 전까지 단계진행을 하기 위해 Step Out 명령을 사용한다. 이러면 함수호출 후에 즉시 그 문장으로 직접적으로 이동한다.
좀 더 복잡한 구문의 일부인 개별함수에 스테핑이 가능한 것은 C 코드에서 많은 중첩된 함수호출을 사용한 경우에 특히 유용하다.
C++에 있어서도 매우 유용한데, 생성자, 소멸자, 연산자, 그리고 다른 사용자정의 오퍼레이터처럼 대다수의 암시적 함수호출을 하는 경향이 있다. 자세한 스테핑은 경우에 따라서는 불필요하게 느려질 수 있다. 이러한 이유로, 문장 단위로 진행할 수 있는데, 이는 빠른 스테핑을 의미한다.

예제 5.
 

3. 코드 커버리지 활성화를 위한 프로젝트 옵션 설정
앞에서 언급된 코드 커버리지 활성화를 위한 프로젝트 옵션 설정 및 디스어셈블리 윈도우의 코드 커버리지 표시에 대한 화면 자료는 그림 3~6을 참조하면 된다.


그림 3.
C/C++ Compiler> Output의 Generate debug information 선택




그림 4.
Linker > Output의 Generate debug information 선택



그림 5.
Debugger > plugins의 Code Coverage 선택



그림 6.
Disassembly 윈도우의 Code Coverage 표시


 

4. 코드 커버리지 결과 출력
컨텍스트 메뉴 중 Save as에서 텍스트 파일 형태로 현재 코드 커버리지 결과를 저장한다(그림 7 참조).
 

 



그림 7.
코드 커버리지 결과 출력


회원가입 후 이용바랍니다.
개의 댓글
0 / 400
댓글 정렬
BEST댓글
BEST 댓글 답글과 추천수를 합산하여 자동으로 노출됩니다.
댓글삭제
삭제한 댓글은 다시 복구할 수 없습니다.
그래도 삭제하시겠습니까?
댓글수정
댓글 수정은 작성 후 1분내에만 가능합니다.
/ 400
내 댓글 모음
저작권자 © 테크월드뉴스 무단전재 및 재배포 금지