자료 참고 안내 1. 본 자료실의 모든 자료 저작권은 ㈜에이치앤에스에 있습니다.

본 자료는 개발하시는데 참고자료 용도로 사용하실 수 있으며 저작권 표시 없이 복사,게재, 출판 하실 수 없습니다. 외부 게재 사용 시 반드시 출처 항목에 회사명과 사이트 주소를 반드시 명시해 주시기 바랍니다.
[표기 예] 출처 : ㈜에이치앤에스(www.hnsts.co.kr) 또는 ㈜HNS(www.hnsts.co.kr)

2. 제품 개발 시 내용과 예제 코드는 수정 및 검증작업을 직접 하셔야 하며 문제 발생에 대한 책임은 ㈜HNS사와 무관합니다.

본사는 자료를 최신내용으로 유지하기 위해 노력하고 있으며 제공되는 정보의 오류 및 내용이 정확하지 않을 경우 사전 공지 없이 업데이트 될 수 있습니다. 자료의 문제점 발견 시 본사로 문의주시면 검토하여 자료를 수정하도록 하겠습니다.

IEC-Series 장치 응용 프로그램 디버깅하는 방법
작성일 2016-01-08 수정일 2022-10-06 조회수 2312
분류 Knowhow
적용
플랫폼
키워드 버그디버깅
첨부파일

본 자료는
1. Mobile Device Center 연결에 의한 디버깅 환경
1-1. 디버깅 시작하기(준비사항)
1-2. Break Point(중단점) & Trace 사용하기
1-3. System.Diagnostics.Debug 관련 기능
1-4. 각종 디버깅 정보 확인하기
2. 비연결 Standalone 디버깅 방법
2-1. Error Message 확인하고 구분하기
2-2. Try-Catch 활용하기
2-3. Log File 기록하기(SmartFile)
2-4. H/W, S/W WatchDog(SmartWatchDog)
2-5. 전역 예외 처리
순서로 진행합니다.

IEC-Series 제품 개발 중 개발자가 예외 처리를 못하거나 또는 개발자의 실수로 인하여 에러는 얼마든지 발생할 수 있으며 이러한 에러를 해결하여 제품의 완성도를 높이기 위해 디버깅하는 방법을 제시하고 있습니다. Visual Studio에서는 기본적으로 디버깅 기능을 제공하고 있어 개발자가 개발 중에 문제가 발생 시 유용하게 디버깅을 할 수 있습니다.

IEC-Series 제품에서는 효율적으로 디버깅을 하기 위해 크게 두 가지 방법이 있습니다.
Mobile Device Center 연결에 의한 디버깅 방법과 Mobile Device Center 연결되지 않은 비연결 Standalone 디버깅 방법입니다.


1. Mobile Device Center 연결에 의한 디버깅 환경 1-1. 디버깅 시작하기(준비사항)

먼저 SmartX Framework(3.2.1 이후 버전) 설치로 개발 환경을 자동 구축하시기 바랍니다.

참고개발환경 구축에 대한 자세한 내용은 “자료실 → SmartX Framework 관련 → Reference Guide → Part 1. 소개 및 개발환경 구축 → 2. 개발환경 구축하기” 내용을 참고하시기 바랍니다.
IEC-Series 제품(대상 장치)을 디버깅을 하기 위해서는 제품 개발 PC에서 ActiveSync 또는 Windows Mobile Device Center 설치가 되어 있어야 합니다.
(개발 PC와 연결 실패 시 경우에 따라 개발 PC에 USB 드라이버를 설치해야 하는 경우도 있습니다.)


Visual Studio 2008에서 프로젝트 빌드 시 두 가지 모드(Debug 모드와 Release 모드)를 지원하며 배포도 두 가지 모드(디버깅 시작과 디버깅하지 않고 시작)을 제공합니다.


Debug 모드와 Release 모드 비교 설명
  • Debug 모드

    ※ 개발 중에 사용하는 모드
    디버깅 정보를 포함하므로 파일 크기가 Release 모드보다 크다.

  • Release 모드

    ※ 개발 완료 후 양산 시에 사용하는 모드
    디버깅 정보를 미포함하므로 파일 크기가 Debug 모드보다 작다.


디버깅 시작과 디버깅하지 않고 시작 비교 설명

[실행 방법] VisualStudio → [메뉴] → [디버그] → [디버깅 시작/디버깅하지 않고 시작]

  • 디버깅 시작

    ※ TRACE를 위한 디버깅 작업 시 사용
    실행 속도가 디버깅하지 않고 시작보다 느리다.

  • 디버깅하지 않고 시작

    ※ 디버깅 작업이 필요 없는 경우에 사용
    실행 속도가 디버깅 시작보다 빠르다.


사용 방식
  • Debug 모드

    ※ 디버깅 시작과 디버깅하지 않고 시작 모두 사용 가능

  • Release 모드

    ※ 디버깅 하지 않고 시작 사용 가능


메뉴에 디버깅하지 않고 시작이 표시되지 않는 경우

메뉴 표시줄에서 마우스 우측 클릭 → [사용자 지정] → [명령] → [디버그] → [디버깅하지 않고 시작]을 메뉴로 드래그 앤 드롭

  • [STEP-1] 메뉴 표시줄에서 마우스 우측 클릭
     
  • [STEP-2] [사용자 지정] → [명령] → [디버그] → [디버깅하지 않고 시작]을 메뉴로 드래그 앤 드롭

1-2. Break Point(중단점) & Trace 사용하기 중단점 설명

중단점(BreakPoint)은 프로그램 동작 중 에러(Error)가 발생하는 부분에 중단점(BreakPoint)을 설정하고 프로그램 동작 시 값을 조사하여 발생되는 문제를 해결할 수 있습니다.

Tracing 방법
  • 에러 위치를 아는 경우

    ▶ 중단점(BreakPoint)을 걸어서 추적

  • 에러 위치를 모르는 경우

    ▶ 중단점(BreakPoint)을 걸지 않고 F5로 추적


  • 다음 중단점이 설정된 상태에서 F5를 누르는 경우

    ▶ 다음 중단점의 위치에서 멈춥니다. 위 그림 a = 100 부분에서 F5를 누르는 경우 다음 중단점인 f = 5 부분에서 멈춥니다.

  • 다음 중단점이 설정 안 된 상태에서 F5를 누르는 경우

    ▶ 에러 위치에서 멈춥니다. 위 그림 a = 100 부분에서 F5를 누르는 경우 에러가 발생하는 위치 m_idx[5] = 10 부분에서 멈춥니다 만약 에러가 없는 소스 코드라면 Form1_Load()이벤트의 마지막에서 멈춥니다.


  • 함수 내부는 확인하지 않고 추적 F10

    ▶ 위 그림 calc1() 메서드에서 F10을 누르면 calc1() 내부를 확인하지 않고 다음 행의 sum = a+b를 추적합니다.

  • 함수 내부를 확인하면서 추적 F11

    ▶ 위 그림 calc1() 메서드에서 F11을 누르면 calc1() 내부로 추적합니다. 즉, F11은 함수가 있으면 함수 내부를 추적하면서 진행합니다.


참고코드를 실행하면서 소스 코드 내의 각 변수 등을 조사식을 통해 값의 변화를 추적 가능합니다. 보다 자세한 내용은 1-4. 각종 디버깅 정보 확인하기를 참고 바랍니다.

1-3. System.Diagnostics.Debug 관련 기능 1) Debug.WriteLine ()

Debug 창에 Write로 쓴 내용이 한 줄 단위로 출력되며 코드를 추적할 때 많이 사용하는 메서드

public static void WriteLine(string message);
(인자) message : 출력 메시지
사용
예시
// 메시지 출력. Visual Studio의 출력창으로 출력
System.Diagnostics.Debug.WriteLine("디버그 출력");

2) Debug.Assert()

Debug 창에서 특정한 조건의 결과를 확인하고 싶을 때 사용하는 메서드. 조건을 확인하여 조건의 결과가 false이면 메시지를 출력합니다.

public static void Assert(bool condition)
public static void Assert(bool condition, string message)
public static void Assert(bool condition, string message, string detailMessage)
(인자) condition : 조건을 확인하며 조건의 결과가 false이면 메시지를 출력합니다.
(인자) message : 출력 메시지1
(인자) detailMessage : 출력 메시지2
사용
예시
a = 100;
// 조건의 결과(a < 90)가 fail 출력. IEC-Series의 팝업창으로 출력
System.Diagnostics.Trace.Assert(a < 90, "1번 메시지");
System.Diagnostics.Trace.Assert(a < 90, "1번 메시지", "1번 메시지 세부 내용");

참고출력창에 Debug.WriteLine이 표시 안될 때 대처 방안
[도구] → [옵션] → [디버깅] → [일반] → 출력창의 모든 텍스트를 [직접 실행] 창으로 리디렉션 체크 해제하기
  • [STEP-1] [도구] → [옵션]을 클릭
     
  • [STEP-2] [디버깅] → [일반] → 출력창의 모든 텍스트를 [직접 실행창]으로 리디렉션 체크 해제하기
Debug Class와 Trace Class 비교 설명
클래스 Debug 클래스 Trace 클래스
설명 일반적인 경우에 사용 심각한 버그일 경우에 사용
Debug
모드
동작 동작
Release
모드
동작 안 함 동작

Debug 클래스에서 WriteLine()과 Assert() 비교 설명
클래스 메서드 리스너 Debug 모드 Release 모드
Debug
클래스
WriteLine() 기본 Visual Studio 출력창에 표시 코드가 삭제되고 빌드되어
출력 안 됨
(동작 안 함)
TextWriterTraceListener를
사용
IEC-Series의 콘솔창에 표시
별도의 파일로 저장
Assert() 기본 IEC-Series의 팝업창에 표시
TextWriterTraceListener를
사용
IEC-Series의 콘솔창에 표시
별도의 파일로 저장
클래스 메서드 리스너 Debug
모드
Release
모드
Debug
클래스
WriteLine() 기본 Visual Studio 출력창에 표시 코드가
삭제되고
빌드되어
출력 안 됨
(동작 안 함)
TextWriter
TraceListe
ner를 사용
IEC-Series의 콘솔창에 표시
별도의 파일
로 저장
Assert() 기본 IEC-Series의 팝업창에 표시
TextWriter
TraceListe
ner를
사용
IEC-Series
의 콘솔창에
표시
별도의 파일
로 저장

Debug 클래스를 통해 추적 또는 디버깅한 결과를 TextWriterTraceListener(출력 위치 지정)를 사용해 IEC-Series의 콘솔(CMD)창에 출력하거나 파일로 저장 가능합니다.

TextWriterTraceListener를 사용해 출력하는 방법
[CASE-1] IEC-Series의 콘솔(CMD)창에 출력
응용
소스 코드
TextWriterTraceListener tr1 = new TextWriterTraceListener(System.Console.Out);
Debug.Listeners.Add(tr1);
System.Diagnostics.Debug.WriteLine("D.1");

[CASE-2] 별도의 파일로 저장
주의Flash Disk에 파일을 쓰는 도중에 전원공급이 불안정하거나 전원이 차단되는 경우 파일 시스템 손상이 발생할 수 있으므로 파일을 저장 시 Flash Disk가 아닌 SD Card 또는 USB로 저장을 강력 권장합니다
응용
소스 코드
TextWriterTraceListener tr1 = new TextWriterTraceListener("SD Card\\output.txt");
Debug.Listeners.Add(tr1);
System.Diagnostics.Debug.WriteLine("D.1");
// a가 90보다 크거나 같은 경우 1번 메시지 출력
System.Diagnostics.Trace.Assert(a < 90, "1번 메시지");
// AutoFlush가 false일 때 강제로 파일에 Flush하려면 Debug.Flush()를 사용
System.Diagnostics.Debug.Flush();
System.Diagnostics.Debug.Close();

1-4. 각종 디버깅 정보 확인하기 1) Watch, Auto, Locals

- Watch(조사식) : 프로그램 디버깅 중에 모든 객체나 변수의 정보 확인 가능
- Auto(자동) : 적절히 조회가 필요할 것 같은 값을 표시
- Locals(지역) : 현재 범위에 있는 지역 변수 표시

Watch

조사식은 디버깅 중에만 사용할 수 있으며 사용자가 조사식에 추가한 여러 변수를 한번에 표시할 수 있습니다. Debugging 진행 도중에 추가한 값이 실시간으로 출력됩니다.


[실행 방법]

조사식에 추가를 원하는 변수에 마우스 우측 클릭 > 조사식 추가 선택


Auto

현재 프로시저에서 실행되는 줄의 범위에 포함된 변수의 값을 볼 수 있는 자동창을 표시합니다.


[실행 방법]

[STEP-1] 중단점을 설정할 위치에서 디버그 → 중단점 설정/해제, 키를 누르거나 F9 클릭
[STEP-2] 디버그 → 창 → 자동을 누르거나 Ctrl+Alt+V → A를 클릭


Locals

디버깅 하는 동안 로컬 범위에 정의된 변수를 표시합니다.


[실행 방법]

[STEP-1] 중단점을 설정할 위치에서 디버그 → 중단점 설정/해제, 키를 누르거나 F9 클릭
[STEP-2] 디버그 → 창 → 지역을 누르거나 Ctrl+Alt+V → L을 클릭


2) Call Stack(호출 스택)

호출 스택은 함수들이 서로 복잡하게 호출하는 경우 함수 호출의 흐름을 추적 가능하도록 도와주는 역할을 합니다.
함수가 호출되면 호출된 함수를 호출 스택에 추가한 다음 함수를 수행합니다. 호출 스택을 통해 현재 스택에 있는 함수의 호출을 볼 수 있습니다.

[CASE-1] Visual Studio에서 calc1() → calc2() → calc3() → calc4() 호출 시 calc4()에서 에러가 발생하면 호출 스택에 이전 호출했던 메서드를 역순으로 출력합니다.

[CASE-2] IEC-Series의 에러 메시지창 → 자세히 클릭(디버깅하지 않고 시작)
  • [STEP-1] 에러 메시지
  • [STEP-2] 자세히 클릭 시
3) Immediate Windows(직접 실행 창)

[실행 방법] 직접 실행창이 안보일 때 Visual Studio의 상단메뉴 디버그 → 창 → 직접 실행(Ctrl+G)
[예시] 디버깅으로 트레이싱 도중 특정 명령을 실행 가능

  • 입력 1

    [직접 실행창]

    System.Buffer.BlockCopy(BitConverter. GetBytes(sd1.m_iValue2), 0, m_bySendData2, 0, sizeof(int));

    [직접 실행창 설명]

    직접 실행창에 System.Buffer.BlockCopy 함수를 입력하여 실행해볼 수 있습니다. System.Buffer.BlockCopy 함수는 BitConverter. GetBytes(sd1.m_iValue2)의 소스 데이터를 m_bySendData2로 복사하되 0지점부터 sizeof(int)개수 만큼 복사하는 역할을 합니다.

    [결과]

    식을 계산했지만 값이 없습니다.








    [결과 설명]

    BlockCopy 함수의 리턴 값이 없으며 m_bySendData2의 값으로 함수의 결과를 확인 가능

  • 입력 2

    [직접 실행창]

    m_bySendData2

    [직접 실행창 설명]

    함수가 정상 실행되었는지 확인을 위해 m_bySendData2 배열 데이터의 값을 출력해봅니다.

    [결과]

    {byte[10]}
    [0] : 13
    [1] : 10
    [2] : 0
    [3] : 0
    [4] : 0
    [5] : 0
    [6] : 0
    [7] : 0
    [8] : 0
    [9] : 0

    [결과 설명]

    sd1.m_iValue2의 값 [0]:13, [1]:10, [2]:0,[3]:0 이 m_bySendData2의 [0]:13, [1]:10, [2]:0,[3]:0으로 정상 복사됨


  • 입력 1

    [직접 실행창]

    System.Buffer.BlockCopy(BitConverter. GetBytes(sd1.m_iValue2), 0, m_bySendData2, 0, sizeof(int));

    [직접 실행창 설명]

    직접 실행창에 System.Buffer.BlockCopy 함수를 입력하여 실행해볼 수 있습니다. System.Buffer.BlockCopy 함수는 BitConverter. GetBytes(sd1.m_iValue2)의 소스 데이터를 m_bySendData2로 복사하되 0지점부터 sizeof(int)개수 만큼 복사하는 역할을 합니다.

    [결과]

    식을 계산했지만 값이 없습니다.

    [결과 설명]

    BlockCopy 함수의 리턴 값이 없으며 m_bySendData2의 값으로 함수의 결과를 확인 가능

  • 입력 2

    [직접 실행창]

    m_bySendData2

    [직접 실행창 설명]

    함수가 정상 실행되었는지 확인을 위해 m_bySendData2 배열 데이터의 값을 출력해봅니다.

    [결과]

    {byte[10]}
    [0] : 13
    [1] : 10
    [2] : 0
    [3] : 0
    [4] : 0
    [5] : 0
    [6] : 0
    [7] : 0
    [8] : 0
    [9] : 0

    [결과 설명]

    sd1.m_iValue2의 값 [0]:13, [1]:10, [2]:0,[3]:0 이 m_bySendData2의 [0]:13, [1]:10, [2]:0,[3]:0으로 정상 복사됨


[예시] 실제 소스 코드에서 캡쳐 화면

  • [STEP-1] 소스 코드 내에서 트레이싱을 하는 상태
  • [STEP-2] 원본 소스 코드 vs 원본 소스 코드의 수정

  • 원본 소스 코드

    // sd1.m_iValue2에는 int형 데이터 2573가 있음
    [직접 실행창에 입력]
    BitConverter.GetBytes(sd1.m_iValue2)
    {byte[4]}
    [0] : 13
    [1] : 10
    [2] : 0
    [3] : 0

  • 원본 소스 코드의 수정

    // sd1.m_iValue2에는 int형 데이터 2573가 있음
    [직접 실행창에 입력]
    BitConverter.GetBytes(1000)
    {byte[4]}
    [0] : 232
    [1] : 3
    [2] : 0
    [3] : 0


2. 비연결 Standalone 디버깅 방법 2-1. Error Message 확인하고 구분하기

시스템 출력 에러와 프로그램 출력 에러

  • 시스템 출력 에러

    [예시 1. OS에서 출력하는 에러]

    프로젝트가 에러의 직접적인 원인이 아닌 간접적인 원인일 수 있습니다. 에러의 원인을 찾기가 오래 걸리고 대표적으로 발생할 수 있는 문제는 사용 이미지가 시스템 권장 이미지가 아닌 경우 발생 가능합니다.

    참고 “자료실 → SmartX Framework 관련 → Reference Guide → Part 2.사용자 인터페이스 (UI) 컴포넌트 → 1. 사용자 인터페이스(UI) 공통 사항 및 장점 → 3) 이미지 관련 주의사항” 내용을 참고하시기 바랍니다.
    참고 만약 원인을 찾기가 어려운 경우 HNS에 연락주시면 원인을 찾아드리겠습니다.
  • 프로그램 출력 에러

    [예시1. 예외 처리가 안되어 발생하는 에러]

    [예시2. 프로그래머가 직접 출력하는 에러]

    자세히 클릭 시 어느 함수에서 발생하는지 확인하면 좀 더 쉽게 찾을 수 있습니다. Application 예외 처리를 try-catch로 해주시기 바랍니다.


2-2. try-catch-finally 활용하기
[구조] [설명]
try
{
// 실행 코드
}
catch(Exception ex)
{
// 예외 캐치
}
finally   // 생략 가능
{
// 무조건 실행
}
프로그램에서 예외(Exception)가 발생했을 때를 감지하고 어떻게 처리할지를 정의하는 과정을 try-catch 과정이라고 합니다.

catch(Exception ex)에서 인자(Exception)는 필터로서 이부분에 필터링할 예외를 선언합니다. ex를 선언하는 경우 catch 구문의 지역 변수인 Message, StarckTrace를 사용 가능합니다.

인자값으로 특정 예외를 선언한 경우 해당 예외를 캐치하고 Exception으로만 선언한 경우 모든 예외를 캐치합니다. 다양한 종류의 예외가 있으며 보다 자세한 예외는 인터넷의 MSDN을 참고하시기 바랍니다.
finally는 try~catch 블록이 종료될 때 반드시 실행되는 블록이며 생략 가능합니다.

[예제 응용] try문에 1개의 예외와 catch가 1개인 경우
// NullReferenceException 예외 처리
try
{
int[] inumbers = null;
int in = inumbers[0];
}
// 특정 에러를 잡기 위해 해당 에러를 명시
catch (NullReferenceException)
{
SmartX.SmartMessageBox.Show("참조 개체가 초기화되지 않은 상태에서 참조된 경우에 발생");
}
finally
{
SmartX.SmartMessageBox.Show("반드시 실행되는 부분");
}
[예제 응용] try문에 복수 개의 예외와 catch가 복수개인 경우
try
{
// I/O Exception 예외 처리
smartSerialPort1.Open(SmartX.SmartSerialPort.BAUDRATE._115200bps, SmartX.SmartSerialPort.COMPORTNO.COM7, 500);
smartSerialPort1.Open(SmartX.SmartSerialPort.BAUDRATE._115200bps, SmartX.SmartSerialPort.COMPORTNO.COM7, 500);

// FileNotFoundException 예외 처리
StreamReader reader = new StreamReader("new.txt");

// 배열 인덱스 참조 예외 처리
m_idx = new byte[4];
m_idx[5] = 0x77;

// FormatException 예외 처리

string input = "ABCD";
int result = Int32.Parse(input);
}

catch (IOException)
{
SmartX.SmartMessageBox.Show(" IO PORT 예외");
}
catch (FileNotFoundException)
{
SmartX.SmartMessageBox.Show(" 파일을 찾을 수 없습니다.");
}
catch (System.IndexOutOfRangeException)
{
SmartX.SmartMessageBox.Show(" 배열인덱스 참조 예외 처리");
}
catch (FormatException)
{
SmartX.SmartMessageBox.Show("형식이 잘못된 경우에 발생");
}
finally
{
SmartX.SmartMessageBox.Show("반드시 실행되는 부분");
}
[C# throw 설명]
사용자가 강제로 Exception을 발생할 때 사용합니다. 아래 예제에서 throw문이 checknum 메서드 내부에서 호출되면 시스템에서는 catch문을 검색하고 메시지를 출력합니다.

// 사용자 정의 Exception 생성. 0보다 작을 경우 메시지 출력
public class MinusCheckException : System.Exception
{
public MinusCheckException(String message) : base(message) { }
}

try
{
// 음수인 경우 사용자 정의 MinusCheckException 발생
checknum(-1);
checknum(-5);
}
// Exception Catch
catch (Exception ex)
{
// digit가 0보다 작습니다.를 출력
System.Diagnostics.Trace.WriteLine(ex.Message);
}

void checknum( int idigit)
{
if (idigit > 0)
System.Diagnostics. Debug.WriteLine("digit가 0보다 큽니다");
else
throw new MinusCheckException("digit가 0보다 작습니다");
}
[catch 구문의 지역 변수]
- Message : 예외에 포함된 메시지를 포함하고 있는 속성입니다.
- StackTrace : 오류 발생 위치를 알 수 있으며, 스택을 추적한 정보를 포함하고 있습니다.
[catch 구문의 지역 변수 활용 예시]
try
{
int[] numbers = null;
int n = numbers[0];
}
catch (NullReferenceException ex)
{
// 스택을 추적한 정보를 표시
System.Diagnostics.Debug.Write(ex.StackTrace);
// 예외에 포함된 메시지를 표시
System.Diagnostics.Debug.Write(ex.Message);
}

2-3. Log File 기록하기(SmartFile)
SmartFile을 사용하여 각종 에러 메시지를 저장 가능하며 로그 파일을 기록해두면 데이터를 필터링하거나 에러 방지를 위한 로직을 강화하는데 도움이 됩니다.
// 줄번호
private int m_iNum = 0;
private DateTime m_NowTime;
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
// 저장 경로 : Flash Disk
//smartFile1.FilePathName = "Flash Disk\\Exception.Txt";
// 저장 경로 : SD Card
smartFile1.FilePathName = "SD Card\\Exception.Txt";
// 저장 경로 : USB 메모리(하드 디스크)
// smartFile1.FilePathName = "하드 디스크\\Exception.Txt";

if (smartFile1.Open() == true)
{
SmartX.SmartMessageBox.Show("파일1 오픈 성공!!!");
}
}

private void CallCalc_Click(object sender, EventArgs e)
{
Calc();
}

private void Calc()
{
// 참조 개체 초기화 예외 처리
try
{
int[] inumbers = null;
int in = inumbers[0];
}
catch (NullReferenceException ex)
{
m_NowTime = smartConfigs1.ControlPanel.GetSystemDateTime();
// 예외 내용을 SmartFile을 사용하여 즉시 처리 방식으로 파일 기록
// 즉시 파일에 기록하기 때문에 예외 발생 이후 시스템이 다운되는 문제가 발생하여도 로그 파일에 저장됨
// 로그 파일에 저장됨
// 줄번호, 예외명, 예외 발생 위치, 예외 발생 날짜/시간
smartFile1.StringType.Write("[" + (++m_iNum).ToString() + "]" + "예외명 :" + ex.Message + "예외 발생 위치:Calc()" + NowTime.ToString("MMMM dd, yyyy H:mm:ss"));
}
}

private void Form1_Closing(object sender, CancelEventArgs e)
{
smartFile1.Close();
}
2-4. H/W, S/W WatchDog(SmartWatchDog)

프로그램 예외를 전부 처리하지 못한 상황에서 예상치 못한 예외가 발생하는 경우 오류 메시지 창이 출력되고 시스템이 멈추는 문제가 발생합니다.
SmartWatchDog은 이러한 경우에 자동으로 시스템을 리부팅시키고 동작하도록 해주는 기능입니다. H/W WatchDog과 S/W WatchDog 으로 나누어 집니다.

[표] H/W WatchDog과 S/W WatchDog 비교
H/W WatchDog S/W WatchDog
사용 상황 시스템이 다운될 정도의 버그가 발생하여
시스템을 강제로 재시작 해야하는 상황
응용 프로그램에서 처리되지 않은 예외가 발생하는 경우
로그 파일로 저장 및 시스템을 재시작 해야하는 상황
처리 범위 사용자가 만든 코드가 아닌 운영체제 레벨의 오류를 처리 사용자가 만든 코드상의 예외를 처리 응용 프로그램 레벨의 오류를 처리
처리 기능 시스템 리부팅 시스템 리부팅 로그파일 저장
1) H/W WatchDog 사용 방법 예시(활성화 방법)

[소스코드 설정 방법]

// Hardware WatchDog 기능을 활성화
smartWatchDog1.SetHardwareWatchEnable(true);


[화면에서의 설정 방법]

  • [STEP-1] 바탕화면의 SystemConfig 클릭
     
  • [STEP-2] Hardware WatchDog Timer Option에서 [WatchDog Enable]체크 → Apply 클릭

2) S/W WatchDog 사용방법 예시(활성화 방법)
  • [STEP-1] 예외 발생 코드 실행

    // 디버그 모드 활성화(시스템 재시작 여부 확인)
    smartWatchDog1.DebugMode = true;
    // WatchDog 감시 시작
    smartWatchDog1.Start();
    // 강제로 예외 발생시킴
    private void Exception_Click(object sender, EventArgs e)
    {
    int[] idumy = new int[3];
    // 처리 되지않은 예외 발생 "IndexOutOfRangeException"
    idumy[7] = 1;
    }


  • [STEP-2] DebugMode = true인 경우 시스템 재시작 여부를 확인합니다.
     
  • [STEP-3] DebugMode = false인 경우 시스템 재시작 여부를 확인안하고 바로 재시작합니다.
참고자세한 내용은 “자료실 → SmartX Framework 관련 → Reference Guide → Part 3. 하드웨어 장치 제어 컴포넌트 → 12. SmartWatchDog“의 내용을 참고하시기 바랍니다.

2-5. 전역 예외 처리

전역에서 예외 및 Error가 발생하면 Program.cs파일의 Main에서 UnhandledExceptionEventHandler 이벤트가 발생

참고자세한 내용은 “자료실 → Tech Note → 8. 전역 예외 처리방법“의 내용을 참고하시기 바랍니다.
맨 위로
팝업닫기

(주)에이치앤에스('http://hnsts.co.kr/'이하 '(주)에이치앤에스 웹사이트')는 개인정보보호법에 따라 이용자의 개인정보 보호 및 권익을 보호하고 개인정보와 관련한 이용자의 고충을 원활하게 처리할 수 있도록 다음과 같은 처리방침을 두고 있습니다.

(주)에이치앤에스 웹사이트는 개인정보처리방침을 개정하는 경우 웹사이트 공지사항(또는 개별공지)을 통하여 공지할 것입니다.

○ 본 방침은 2011년 4월 1일부터 시행됩니다.

1. 개인정보의 처리 목적 (주)에이치앤에스 웹사이트는 개인정보를 다음의 목적을 위해 처리합니다. 처리한 개인정보는 다음의 목적 이외의 용도로는
사용되지 않으며 이용 목적이 변경될 시에는 사전동의를 구할 예정 입니다.
가. 민원사무 처리
민원인의 신원 확인, 민원사항 확인, 사실조사를 위한 연락 · 통지, 처리결과 통보 등을 목적으로 개인정보를 처리합니다.
2. 개인정보 파일 현황
1. 개인정보 파일명 : 고객의 소리
  • - 개인정보 항목 : 이메일, 휴대전화번호, 자택전화번호, 이름, 서비스 이용 기록, 접속 로그, 쿠키, 접속 IP 정보
  • - 수집방법 : 웹사이트
  • - 보유근거 : 이용자 동의
  • - 보유기간 : 3년
3. 개인정보의 제3자 제공에 관한 사항
① (주)에이치앤에스 웹사이트는 원칙적으로 이용자의 개인정보를 제1조에서 명시한 목적 범위 내에서 처리하며, 본래의 범위를 초과하여 처리하거나 제3자에게 제공하지 않습니다.
다만, 다음의 경우에는 개인정보를 제3자에게 제공할 수 있습니다.
  • – 이용자가 사전에 제3자 제공 및 공개에 동의한 경우
  • – 법령 등에 의해 제공이 요구되는 경우
  • – 서비스의 제공에 관한 계약의 이행을 위하여 필요한 개인정보로서 경제적/기술적인 사유로 통상의 동의를 받는 것이 현저히 곤란한 경우
  • – 개인을 식별하기에 특정할 수 없는 상태로 가공하여 이용하는 경우
4. 정보주체의 권리,의무 및 그 행사방법 이용자는 개인정보주체로서 다음과 같은 권리를 행사할 수 있습니다.
① 정보주체는 (주)에이치앤에스 웹사이트에 대해 언제든지 다음 각 호의 개인정보 보호 관련 권리를 행사할 수 있습니다.
  • 1. 개인정보 열람요구
  • 2. 오류 등이 있을 경우 정정 요구
  • 3. 삭제요구
  • 4. 처리정지 요구
② 제1항에 따른 권리 행사는 (주)에이치앤에스 웹사이트에 대해 개인정보 보호법 시행규칙 별지 제8호 서식에 따라 서면, 전자우편, 모사전송(FAX) 등을 통하여 하실 수 있으며 (주)에이치앤에스 웹사이트는
이에 대해 지체 없이 조치하겠습니다.
③ 정보주체가 개인정보의 오류 등에 대한 정정 또는 삭제를 요구한 경우에는 (주)에이치앤에스 웹사이트는 정정 또는 삭제를 완료할 때까지 당해 개인정보를 이용하거나 제공하지 않습니다.
④ 제1항에 따른 권리 행사는 정보주체의 법정대리인이나 위임을 받은 자 등 대리인을 통하여 하실 수 있습니다. 이 경우 개인정보 보호법 시행규칙 별지 제11호 서식에 따른 위임장을
제출하셔야 합니다.
5. 제3자에게의 개인정보 제공
① (주)에이치앤에스 웹사이트는 다음의 개인정보 항목을 처리하고 있습니다.
<민원사무 처리>
– 필수항목 : 이름, 휴대전화번호, 자택전화번호, 이메일, 서비스 이용 기록, 접속로그, 쿠키, 접속IP 정보
6. 개인정보의 파기
(주)에이치앤에스 웹사이트는 원칙적으로 개인정보 처리목적이 달성된 경우에는 지체없이 해당 개인정보를 파기합니다. 파기의 절차, 기한 및 방법은 다음과 같습니다.
  • –파기절차 이용자가 입력한 정보는 목적 달성 후 별도의 DB에 옮겨져(종이의 경우 별도의 서류) 내부 방침 및 기타 관련 법령에 따라 일정기간 저장된 후 혹은 즉시 파기됩니다. 이 때, DB로 옮겨진 개인정보는 법률에 의한 경우가 아니고서는 다른 목적으로 이용되지 않습니다.-파기기한이용자의 개인정보는 개인정보의 보유기간이 경과된 경우에는 보유기간의 종료일로부터 5일 이내에, 개인정보의 처리 목적 달성, 해당 서비스의 폐지, 사업의 종료 등 그 개인정보가 불필요하게 되었을 때에는 개인정보의 처리가 불필요한 것으로 인정되는 날로부터 5일 이내에 그 개인정보를 파기합니다.
  • –파기방법 전자적 파일 형태의 정보는 기록을 재생할 수 없는 기술적 방법을 사용합니다. 종이에 출력된 개인정보는 분쇄기로 분쇄하거나 소각을 통하여 파기합니다.
7. 개인정보의 안전성 확보 조치
(주)에이치앤에스 웹사이트는 개인정보보호법 제29조에 따라 다음과 같이 안전성 확보에 필요한 기술적/관리적 및 물리적 조치를 하고 있습니다.
1. 정기적인 자체 감사 실시
개인정보 취급 관련 안정성 확보를 위해 정기적(분기 1회)으로 자체 감사를 실시하고 있습니다.
2. 개인정보 취급 직원의 최소화 및 교육
개인정보를 취급하는 직원을 지정하고 담당자에 한정시켜 최소화 하여 개인정보를 관리하는 대책을 시행하고 있습니다.
3. 내부관리계획의 수립 및 시행
개인정보의 안전한 처리를 위하여 내부관리계획을 수립하고 시행하고 있습니다.
4. 해킹 등에 대비한 기술적 대책
(주)에이치앤에스 웹사이트는 해킹이나 컴퓨터 바이러스 등에 의한 개인정보 유출 및 훼손을 막기 위하여 보안프로그램을 설치하고 주기적인 갱신·점검을 하며 외부로부터 접근이 통제된 구역에
시스템을 설치하고 기술적/물리적으로 감시 및 차단하고 있습니다.
5. 개인정보의 암호화
이용자의 개인정보는 비밀번호는 암호화 되어 저장 및 관리되고 있어, 본인만이 알 수 있으며 중요한 데이터는 파일 및 전송 데이터를 암호화 하거나 파일 잠금 기능을 사용하는 등의
별도 보안기능을 사용하고 있습니다.
6. 접속기록의 보관 및 위변조 방지
개인정보처리시스템에 접속한 기록을 최소 6개월 이상 보관, 관리하고 있으며, 접속 기록이 위변조 및 도난, 분실되지 않도록 보안기능 사용하고 있습니다.
7. 개인정보에 대한 접근 제한
개인정보를 처리하는 데이터베이스시스템에 대한 접근권한의 부여,변경,말소를 통하여 개인정보에 대한 접근통제를 위하여 필요한 조치를 하고 있으며 침입차단시스템을 이용하여
외부로부터의 무단 접근을 통제하고 있습니다.
8. 문서보안을 위한 잠금장치 사용
개인정보가 포함된 서류, 보조저장매체 등을 잠금장치가 있는 안전한 장소에 보관하고 있습니다.
9. 비인가자에 대한 출입 통제
개인정보를 보관하고 있는 물리적 보관 장소를 별도로 두고 이에 대해 출입통제 절차를 수립, 운영하고 있습니다.
8. 개인정보 보호책임자 작성
① (주)에이치앤에스 웹사이트는 개인정보 처리에 관한 업무를 총괄해서 책임지고, 개인정보 처리와 관련한 정보주체의 불만처리 및 피해구제 등을 위하여 아래와 같이 개인정보 보호책임자를
지정하고 있습니다.
▶ 개인정보 보호책임자
성명 : 김진효
소속 : (주)에이치앤에스
전화번호 : 02-6402-8001
이메일 : hns@hnsts.co.kr
② 정보주체께서는 (주)에이치앤에스 웹사이트의 서비스(또는 사업)을 이용하시면서 발생한 모든 개인정보 보호 관련 문의, 불만처리, 피해구제 등에 관한 사항을 개인정보 보호책임자 및
담당부서로 문의하실 수 있습니다. (주)에이치앤에스 웹사이트는 정보주체의 문의에 대해 지체 없이 답변 및 처리해드릴 것입니다.
9. 개인정보침해 구제방법
정보주체는 개인정보침해로부터 구제받고자 하는 경우 다음과 같은 기관에 도움을 요청할 수 있습니다.
▶ 개인정보 침해신고센터 (한국인터넷진흥원 운영)
– 소관업무 : 개인정보 침해사실 신고, 상담 신청
– 홈페이지 : privacy.kisa.or.kr
– 전화 : (국번없이) 118
– 주소 : (138-950) 서울시 송파구 중대로 135 한국인터넷진흥원 개인정보침해신고센터
▶ 개인정보 분쟁조정위원회 (한국인터넷진흥원 운영)
– 홈페이지 : privacy.kisa.or.kr
– 전화 : (국번없이) 118
– 주소 : (138-950) 서울시 송파구 중대로 135 한국인터넷진흥원 개인정보침해신고센터
10. 개인정보 처리방침 변경
① 이 개인정보처리방침은 시행일로부터 적용되며, 법령 및 방침에 따른 변경내용의 추가, 삭제 및 정정이 있는 경우에는 변경사항의 시행 7일 전부터 공지사항을 통하여 고지할
것입니다.
팝업닫기

본 웹사이트에 게시된 이메일 주소가 전자우편 수집 프로그램이나 그 밖의 기술적 장치를 이용하여 무단으로 수집되는 것을 거부하며, 이를 위반시 정보통신망법에 의해 형사처벌됨을 유념하시기 바랍니다.

게시일 : 2011.4.1