디버깅 기법
- 업데이트 날짜:2025-08-27
- 10분 (읽기 시간)
VI가 깨지지는 않았으나 예상치 않은 데이터를 얻었을 경우 다음 몇 가지 기술을 사용하여 VI 또는 블록다이어그램 데이터 흐름의 문제점을 확인하고 수정할 수 있습니다. 다음의 기술을 사용하여 VI를 디버그할 수 없다면 해당 VI에 경합 조건이 발생했을 수도 있습니다.
에러 클러스터
대부분의 내장 VI와 함수에는 에러 입력 및 에러 출력 파라미터가 있습니다. 이 파라미터들은 블록다이어그램의 각 노드에서 접할 수 있는 에러를 찾고, 에러가 있으면 어디에서 에러가 발생했는지 보여줍니다. 이 매개변수는 사용자가 만든 VI에서도 사용 가능합니다.
VI와 함수의 에러 파라미터를 연결할 때, 에러 입력 및 에러 출력 클러스터는 다음과 같은 정보 구성요소를 제공합니다:
- 상태는 에러가 발생했을 때 참을 보고하는 불리언 값입니다.
- 코드는 에러를 숫자로 표현하는 32비트 부호있는 정수입니다. 상태에서 거짓(FALSE)이 보고되고 에러 코드가 0이 아닌 경우, 에러가 아닌 경고를 표시.
- 소스는 어디에서 에러가 발생했는지 나타내는 문자열입니다.
경고
경고가 있어도 VI를 실행할 수는 있지만, 예상하지 못한 동작을 일으킬 수 있습니다. VI를 디버깅할 때는 반드시 경고를 디스플레이하십시오. VI에 경고가 나타나는 경우, 에러 리스트 윈도우를 참조하여 에러의 원인을 찾아내고 VI를 수정합니다.
실행 하이라이트
다음과 같이 실행 하이라이트 버튼을 클릭하여 블록다이어그램 실행의 애니메이션을 봅니다.
실행 하이라이트는 블록다이어그램의 한 노드에서 다른 노드까지의 데이터 이동을 와이어를 따라 움직이는 방울을 사용하여 보여줍니다. 실행 하이라이트를 단계별 실행과 함께 사용하여 데이터 값이 VI를 통하여 어떻게 노드와 노드 사이를 움직이는지 확인합니다.
|
노트 실행 하이라이트는 VI의 실행 속도를 현저히 저하시킵니다. 만약 VI의 실행이 예상보다 느린 경우, SubVI의 실행 하이라이트를 껐는지 확인합니다. |
에러 출력 클러스터에 에러가 발생하는 경우, 이 에러 값은 에러 출력의 옆에 빨간 경계로 나타납니다. 에러가 없다면 녹색 경계가 있는 에러 출력 옆에 [확인]이 나타납니다.
단계별 실행
VI를 단계별로 실행하여 블록다이어그램에서 VI의 각 동작을 확인할 수 있습니다. 다음과 같은 단계별 실행 버튼은 단계별 실행 모드에서의 VI 또는 subVI 실행에만 영향을 줍니다.
블록다이어그램의 도구 모음에서 단계별 실행 들어가기 또는 단계별 실행 건너뛰기 버튼을 클릭하여 단계별 실행 모드로 들어갑니다. 커서를 단계별 실행 건너뛰기, 단계별 실행 들어가기, 단계별 실행 나가기 버튼 위에 놓으면, 해당 버튼을 클릭할 때 다음 단계를 설명하는 팁 상자가 보입니다. SubVI를 단계별로 실행하거나 또는 일반적인 방식으로 실행할 수 있습니다.
VI를 단계별로 실행하면, 노드가 깜박이면서 실행할 준비가 되었음을 나타냅니다. 실행 하이라이트를 켜고 VI를 단계별로 실행하는 경우, 다음과 같은 실행 문양이 현재 실행 중인 subVI의 아이콘에 나타납니다.
프로브 도구
다음과 같이 프로브 도구를 사용하여 VI를 실행할 때 와이어에서 중간 값을 점검합니다.
정확하지 않은 데이터를 반환할 수 있는 일련의 작업을 거치는 복잡한 블록다이어그램의 경우, 프로브 도구를 사용합니다. 프로브 도구를 실행 하이라이트, 단계별 실행, 브레이크포인트와 함께 사용하여 올바르지 않은 데이터의 유무와 위치를 확인할 수 있습니다. 데이터가 있는 경우에는, 실행 하이라이트 또는 단계별 실행이 진행 중이거나 브레이크포인트에서 일시 정지했을 때 프로브가 즉시 업데이트되고 디버그 윈도우에 데이터를 디스플레이합니다. 또한 단계별 실행 또는 브레이크포인트로 인해 노드에서 일시 정지 상태일 때, 방금 실행된 와이어를 프로브하면 해당 와이어를 따라 진행 중인 값을 볼 수 있습니다.
프로브의 타입
일반 프로브를 사용하거나, 데이터 확인을 위한 컨트롤 팔레트의 인디케이터를 사용하거나, 제공된 프로브를 사용하거나, 사용자 정의된 제공된 프로브를 사용하거나, 새 프로브를 생성하여 VI가 실행되는 동안 와이어에서 중간값을 점검할 수 있습니다.
일반
일반 프로브를 사용하여 와이어를 통과하는 데이터를 봅니다. 와이어에서 마우스 오른쪽 버튼을 클릭한 후 바로 가기 메뉴에서 사용자 프로브≫일반 프로브를 선택하여 일반 프로브를 사용합니다.
일반 프로브는 데이터를 디스플레이합니다. 일반 프로브를 설정하여 데이터에 응답할 수 없습니다.
이미 해당 데이터 타입에 사용자 또는 제공된 프로브를 지정한 경우를 제외하고, LabVIEW는 와이어에서 마우스 오른쪽 버튼을 클릭한 후 프로브를 선택할 때 일반 프로브를 디스플레이합니다.
VI와 유사한 방식으로 사용자 프로브를 디버깅할 수 있습니다. 하지만, 프로브는 자신의 블록다이어그램뿐만 아니라 그 SubVI의 블록다이어그램도 프로브할 수 없습니다. 프로브를 디버그할 때 일반 프로브를 사용합니다.
인디케이터를 사용하여 데이터 보기
또한 인디케이터를 사용하여 와이어를 통과하는 데이터를 볼 수 있습니다. 예를 들어 숫자 데이터를 보는 경우, 프로브 내의 차트를 사용하여 데이터를 볼 수 있습니다. 와이어에서 마우스 오른쪽 버튼을 클릭하고 바로 가기 메뉴에서 사용자 프로브≫컨트롤을 선택한 후, 사용하려는 인디케이터를 선택합니다. 또한 컨트롤 팔레트의 컨트롤 선택 아이콘을 클릭한 후 컴퓨터나 서버의 공유 디렉토리에 저장된 사용자 컨트롤 또는 타입 정의를 선택할 수 있습니다. 타입 정의를 사용하여 프로브된 데이터를 보는 경우, LabVIEW는 타입 정의를 사용자 컨트롤처럼 취급합니다.
선택한 인디케이터의 데이터 타입이 마우스 오른쪽 버튼으로 클릭한 와이어의 데이터 타입과 다를 경우, LabVIEW는 이 인디케이터를 와이어에 놓지 않습니다.
제공된 프로브
제공된 프로브는 와이어를 통과하는 데이터의 포괄적인 정보를 디스플레이하는 VI입니다. 예를 들어 VI 참조 번호 프로브는 VI 이름, VI 경로, 참조의 16진수 값에 대한 정보를 반환합니다. 또한 제공된 프로브를 사용하여 와이어를 통과하는 데이터에 기초하여 응답할 수 있습니다. 예를 들어, 에러 클러스터의 에러 프로브를 사용하여 에러 상태, 코드, 소스, 설명을 받으며 에러나 경고가 발생한 경우 조건적 브레이크포인트를 설정할 것인지 지정합니다.
제공된 프로브는 사용자 프로브 바로 가기 메뉴의 상단에 나타납니다. 와이어에서 마우스 오른쪽 버튼을 클릭한 후 바로 가기 메뉴에서 사용자 프로브를 선택한 다음 제공된 프로브를 선택합니다. 마우스 오른쪽 버튼을 클릭한 와이어의 데이터 타입과 일치하는 프로브만 바로 가기 메뉴에 나타납니다.
사용자
새 프로브 생성 대화 상자를 사용하여 기존의 프로브를 기반으로 프로브를 만들거나 새 프로브를 생성할 수 있습니다. 와이어에서 마우스 오른쪽 버튼을 클릭하고 바로 가기 메뉴에서 사용자 정의 프로브≫새로 만들기를 선택하여 새 프로브 생성 대화 상자를 디스플레이합니다. LabVIEW가 와이어를 따라 흐르는 데이터를 프로브하는 방법을 더 많이 컨트롤하려는 경우 프로브를 생성하십시오. 새 프로브를 생성할 때, 프로브의 데이터 타입은 마우스 오른쪽 버튼으로 클릭한 와이어의 데이터 타입과 같습니다. 생성한 프로브를 편집하려는 경우, 프로브를 저장한 디렉토리에서 해당 프로브를 열어야 합니다.
사용자 프로브 바로 가기 메뉴에서 프로브를 선택한 후, 컨트롤 선택 팔레트 옵션을 사용하여 탐색하거나 새 프로브 생성 대화 상자를 사용하여 새 프로브를 생성합니다. 새 프로브는 해당 데이터 타입의 기본 프로브가 되며, LabVIEW는 와이어에서 마우스 오른쪽 버튼을 클릭한 후 바로 가기 메뉴에서 프로브를 선택했을 때 이 프로브를 로드합니다. LabVIEW는 마우스 오른쪽 버튼을 클릭한 와이어의 데이터 타입과 정확히 일치하는 프로브만을 로드합니다. 즉, LabVIEW가 데이터 변환은 할 수 있지만, 배정도 부동소수 프로브가 32비트 부호없는 정수 와이어를 프로브할 수는 없습니다.
샘플링 프로브
(FPGA Module) 호스트 VI 또는 FPGA VI에서 샘플링 프로브를 사용하여 VI가 실행되는 동안 와이어의 중간값을 확인하고 Single-Cycle Timed 루프의 신호를 디버깅할 때와 같이 시간에 따른 신호 데이터의 변경 사항을 확인합니다.
호스트 VI에서 샘플링 프로브를 사용하는 경우, 먼저 프로브의 샘플링 소스를 지정해야 합니다. 샘플링 소스는 연관된 LabVIEW가 샘플이나 데이터를 읽을 시기를 결정합니다. 샘플링 프로브를 호스트 VI에서 사용하는지 또는 FPGA VI에서 사용하는지 여부에 따라 While 루프, For 루프, 또는 FPGA 시뮬레이션 시간을 샘플링 소스로 사용할 수 있습니다.
브레이크포인트
다음에서 보이는 대로 브레이크포인트 도구를 사용하여 VI, 노드, 와이어에 브레이크포인트를 놓아 해당 위치에서 실행을 일시 중지할 수 있습니다.
와이어에 브레이크포인트를 설정할 때, 실행은 데이터가 와이어를 통과한 후에 일시 정지하고 일시 정지 버튼이 빨간색으로 나타납니다. 블록다이어그램에 브레이크포인트를 놓으면, 블록다이어그램에 있는 모든 노드가 실행된 다음에 실행이 일시 정지됩니다. 블록다이어그램 경계가 빨간색으로 나타나고 깜빡이면서 브레이크포인트의 배치를 반영합니다.
브레이크포인트에서 VI가 일시 중지하면, LabVIEW는 블록다이어그램을 앞으로 가져와서 선택 표시를 사용하여 브레이크포인트를 포함하는 노드, 와이어, 스크립트 라인을 하이라이트합니다. 커서를 기존의 브레이크포인트 위로 이동할 때, 브레이크포인트 도구 커서의 검은 영역은 하얀색으로 나타납니다.
실행 도중 브레이크포인트에 도달하면, VI는 일시 정지하며 일시 정지 버튼은 빨간색으로 나타납니다. 또한, VI의 배경과 경계가 깜박이기 시작합니다. 이 경우 다음과 같은 작업이 가능합니다.
- 단계별 실행 버튼을 사용하여 단계별로 실행.
- VI 실행 이전에 와이어에 놓은 프로브에서 중간값을 확인합니다.
- 와이어 값 유지 옵션을 활성화한 경우, VI를 실행한 후에 놓은 프로브에서 중간값 확인.
- 프런트패널 컨트롤의 값을 변경합니다.
- 호출 리스트 풀다운 메뉴를 확인하여 브레이크포인트에서 정지한 VI를 호출하는 VI의 리스트를 볼 수 있습니다.
- 일시 정지 버튼을 클릭하여 다음 브레이크포인트나 VI가 실행을 마칠 때까지 계속 실행합니다.
LabVIEW는 VI와 함께 브레이크포인트를 저장하지만 브레이크포인트는 VI를 실행할 때만 활성화됩니다. 브레이크포인트를 제거하고 다시 생성하기보다, 브레이크포인트를 저장하여 반복적으로 사용하는 것이 유용할 수도 있습니다. 그러나, VI를 실행할 때마다 모든 브레이크포인트가 활성화되기를 원하지 않는 경우도 있습니다. 브레이크포인트를 비활성화하여 VI를 실행할 때 해당 브레이크포인트에서 실행이 중지되지 않도록 합니다. 디버그 윈도우를 사용하여 기존 브레이크포인트를 비활성화, 활성화, 삭제하거나 위치를 찾을 수 있습니다. 보기≫디버그 윈도우를 선택하거나 블록다이어그램의 객체를 마우스 오른쪽 버튼으로 클릭한 후 바로 가기 메뉴에서 브레이크포인트를 선택하여 디버그 윈도우를 엽니다.
개별 혹은 전체 VI 계층구조에서 브레이크포인트를 제거할 수 있습니다.
LabVIEW가 브레이크포인트를 하이라이트하는 방법
사용자가 브레이크포인트를 블록다이어그램의 어느 위치에 놓았는지에 따라 LabVIEW가 브레이크포인트를 하이라이트하는 방법과 실행이 일시 정지하는 때가 다릅니다. 구조, 노드, 와이어에 브레이크포인트를 놓을 수 있습니다.
구조 브레이크포인트
다음 그림은 브레이크포인트를 가진 For 루프를 보여줍니다. 전체 For 루프가 실행을 끝내기 전에 VI를 멈춥니다. 블록다이어그램 주변의 붉은색 경계선이 브레이크포인트를 하이라이트합니다. 블록다이어그램이 어떤 구조 안에 있다면, 그 구조는 붉은색 경계선을 포함합니다. 블록다이어그램의 모든 노드가 실행을 끝마칠 때 실행 일시 정지가 일어납니다. 브레이크포인트가 루프 구조 내에 있으면, 각 루프 반복 후에 일시 정지하게 됩니다.
노드 브레이크포인트
다음 그림은 [증가] 노드에서 브레이크포인트를 보여줍니다. VI는 [증가] 함수가 실행하기 전에 일시 정지합니다. 또한, 한 와이어에도 브레이크포인트가 있습니다. VI는 [곱하기] 함수가 실행한 후에 다시 한번 일시 정지합니다. 노드 주변의 붉은색 경계선이 브레이크포인트를 하이라이트합니다. 실행 일시 정지는 노드가 실행하기 직전에 일어납니다. 프로브 도구를 사용하여 노드로 들어오는 모든 입력 신호를 감지할 수 있습니다.
와이어 브레이크포인트
다음 그림은 프로브가 첨부된 와이어에서 브레이크포인트를 보여줍니다. 와이어 값 유지를 선택하고 와이어 위에 커서를 놓을 때, 다음과 같이 와이어의 데이터 값을 포함한 팁 상자가 나타납니다. 데이터가 와이어를 통해 전달되고 프로브가 현재 반복의 데이터를 디스플레이한 후에 실행 일시 정지가 일어납니다. 와이어 중간의 붉은색 경계가 브레이크포인트를 하이라이트합니다. 프로브를 와이어에 붙여 놓으면, 프로브도 붉은색 경계를 가지게 됩니다.
비활성화된 브레이크포인트
다음 그림은 For 루프와 증가 노드의 브레이크포인트를 보여줍니다. 모든 브레이크포인트는 비활성화 되어있습니다. VI는 어떤 브레이크포인트 상에서도 정지하지 않습니다. 블록다이어그램 객체를 둘러싼 빨간색 경계는 표준 경계보다 더 가늘어서, 해당 브레이크포인트가 비활성화 되어있음을 표시합니다. 브레이크포인트를 활성화시키면, 빨간색 경계가 두꺼워지며 이는 이전 설명에서 보이는 일반적인 경계와 같은 두께입니다.
실행 일시 정지하기
컨트롤과 인디케이터의 값을 바꾸거나, 호출자로 돌아가기 전에 subVI의 실행 횟수를 조절하거나, subVI 실행을 처음으로 돌리기 위해 subVI의 실행을 일시 정지합니다. SubVI의 모든 호출이 실행이 일시 정지된 상태로 시작하게 하거나 SubVI의 특정한 호출을 일시 정지할 수 있습니다.
SubVI의 모든 호출을 일시 정지하려면, SubVI를 열고 수행≫호출 시 정지를 선택합니다. 다른 VI가 그 SubVI를 호출하면 SubVI는 자동적으로 일시 정지합니다. 단계별 실행에서 이 메뉴 아이템을 선택한 경우, SubVI는 즉시 일시 정지하지 않습니다. SubVI는 호출될 때 일시 정지합니다.
특정한 SubVI 호출을 일시 정지하려면, 블록다이어그램의 SubVI 노드에서 마우스 오른쪽 버튼을 클릭한 후 바로 가기 메뉴에서 SubVI 노드 설정을 선택합니다. 호출 시 정지 확인란에 확인 표시를 하여 SubVI의 해당 인스턴스에서만 실행을 정지합니다.
보기≫VI 계층구조를 선택하여 디스플레이한 VI 계층구조 윈도우는 VI가 멈추거나 일시 정지하는지 여부를 나타냅니다. 다음과 같은 화살표 문양은 VI가 정상적으로 실행되거나 단계별로 실행되고 있음을 나타냅니다.
다음과 같은 정지 문양은 VI가 멈추거나 일시 정지 중임을 나타냅니다.
녹색의 정지 문양이나 흑백의 빈 문양은 VI가 호출될 때 멈추는 것을 나타냅니다. 빨간색 정지 문양이나 흑백의 채워진 문양은 현재 VI가 멈춰 있음을 나타냅니다. 다음과 같은 느낌표 문양은 SubVI가 일시 정지했음을 나타냅니다.
VI는 동시에 일시 정지하고 멈출 수 있습니다.
SubVI의 현재 인스턴스 결정하기
SubVI를 멈추었을 때, 도구 모음의 호출 리스트 풀다운 메뉴에 최상위 VI에서 해당 SubVI까지의 호출자 체인이 나열됩니다. 이 리스트는 VI의 실행 여부와 상관없이 모든 호출 VI를 나열하는 탐색≫이 VI의 호출자를 선택했을 때 나타나는 리스트와 같지 않습니다. 블록다이어그램에 한 개 이상의 인스턴스가 있을 경우 호출 리스트 메뉴를 사용하여 SubVI의 현재 인스턴스를 확인합니다. 호출 리스트 메뉴에서 한 VI를 선택하면, 이 VI의 블록다이어그램이 열리고 LabVIEW는 SubVI의 현재 인스턴스를 하이라이트합니다.
또한, [호출 체인] 함수를 사용하여 현재 VI에서부터 최상위 VI까지 호출자의 체인을 볼 수 있습니다.
블록다이어그램의 섹션 디버그하기
텍스트 기반 프로그래밍 언어에서 코드의 섹션에 주석을 다는 것과 비슷하게 블록다이어그램의 섹션을 비활성화한 VI를 실행할 수 있습니다. 블록다이어그램의 일부 섹션을 비활성화하여 이 부분이 없을 경우 VI의 성능이 향상되는지 확인합니다. 다이어그램 비활성화 구조 안에 비활성화하려는 섹션을 놓습니다.
또한 코드의 섹션을 디버그해서, 문제를 분리시킬 수 있습니다. 코드의 섹션을 디버그하려면, 조건적 비활성화 구조 안에 디버그하려는 코드를 놓습니다.
계측
프로브나, 브레이크포인트 혹은 실행 하이라이트가 VI의 코드를 디버그하는데 시간이 오래 걸리면, 인스트루먼테이션 VI를 생성하십시오. 인스트루먼테이션 VI를 사용하여 VI의 실행을 관찰하고, 문제를 디버그합니다.
디버그하려는 VI에서 데이터를 읽을 수 있고, 결과에 대한 리포트를 생성하도록 인스트루먼테이션 VI를 프로그램합니다. 인스트루먼테이션 VI에서 디버그하려는 코드의 섹션을 지정하고, 디버그하려는 VI의 경로를 지정한 다음, 시간 간격을 포함하십시오.
인스트루먼테이션 VI는 블록다이어그램에서 데이터의 실행 순서를 제공해준다는 점에서 Desktop Execution Trace Toolkit과 비슷한 작용을 합니다.
객체 동작 확인하기
디버깅 도구와 더불어, 다음 기술을 사용하여 VI 또는 블록다이어그램의 데이터 흐름에서 문제를 식별하고, 해결할 수 있습니다.
- 컨트롤과 인디케이터의 형을 확인하여, 부동소수를 정수로, 또는 정수를 더 작은 데이터 형의 정수로 변환하여 오버플로우(overflow)가 발생하고 있는 것은 아닌지 점검합니다. 예를 들어, 8비트 정수만을 받는 함수에 16비트 정수를 연결할 수도 있습니다. 이 때 함수는 16비트 정수를 8비트 정수로 형 변환하는데, 데이터의 손실이 생길 가능성이 높습니다. 추가적인 정보는 정의되지 않은 데이터 방지하기를 참조하십시오.
- 함수 또는 SubVI가 전달하는 데이터가 정의되지 않은 데이터인지 확인합니다. 주로 숫자에서 이런 경우가 발생합니다. 예를 들어, VI의 어떤 지점에서 숫자를 제로로 나누면 Inf (무한대)가 반환됩니다. 그러나 다음 함수나 SubVI에서는 숫자 값을 요구할 수 있습니다.
- For 루프가 의도하지 않게 0번 실행되어 빈 배열을 생성하지는 않았는지 확인합니다. 추가적인 정보는 실행 하이라이트와 정의되지 않는 데이터 방지하기를 참조하십시오.
- 한 번 루프를 실행한 후 그 결과로 생성된 데이터를 저장하여 다음 실행에서 사용하려고 의도한 경우가 아니라면, 시프트 레지스터를 제대로 초기화했는지 확인합니다.
- 소스와 대상 지점의 클러스터 원소의 순서를 점검합니다. LabVIEW는 편집과정에서 데이터 타입이 틀린 것과 클러스터 크기가 틀린 것은 찾아냅니다. 그러나 원소가 같은 데이터 타입이면 찾아내지 못합니다.
- VI에 숨겨진 SubVI가 있는지 확인합니다. 다른 노드의 바로 위에 subVI를 놓거나 그 subVI를 보이게 놓지 않고 그 크기를 축소시켜 놓아서 subVI를 의도하지 않게 가렸을 수 있습니다. VI가 사용하는 subVI의 목록과 보기≫관계 탐색≫이 VI의 SubVI 및 보기≫관계 탐색≫열지 않은 SubVI의 결과를 비교하여 추가적인 subVI가 있는지 확인합니다.
- 보기≫VI 계층구조를 선택하여 연결되지 않은 SubVI를 찾습니다. 연결하지 않은 함수와 달리, 연결하지 않은 VI는 입력을 필수로 설정하지 않는 한 항상 에러를 생성하지는 않습니다. 실수로 와이어하지 않은 subVI를 블록다이어그램에 놓으면, 블록다이어그램을 실행할 때 subVI도 실행됩니다. 결과적으로, 이 VI는 필요없는 여분의 작업을 수행하는 것입니다.
- 기본 도움말 윈도우를 사용하여 블록다이어그램의 각 함수와 subVI의 기본 설정값을 확인합니다. VI나 함수는 옵션 입력이나 권장 입력에 와이어를 연결하지 않았을 때 기본값을 전달합니다. 예를 들어, 불리언 입력을 와이어하지 않으면 기본값인 참으로 설정됩니다.