ASSERT & VERIFY & TRACE

MFC 2019. 4. 4. 09:44 Posted by 쫀다

 

ASSERT, VERIFY

사용법>

ASSERT(평가식);

VERIFY(평가식);

평가식은 TRUE, FALSE로 결정될수 있는 문장이 되어야 합니다.

 

ASSERT, VERIFY 매크로는 디버그 환경에서의 오류를 판단하는데 사용되며,  판단 결과가 0 일때, 에러 메세지를 표시해서, 프로그램내 오류가 있다는것을 통지 해줍니다. ASSERT, VERIFY로 에러메시지가 출력된 경우, 해당 프로그램은 비정상 종료(ABEND)가 됩니다.

프로그램 개발시, 디버그 모드에서 볼수있는, 「Debug Assertion Failed!」문장이 이 매크로(ASSERT, VERIFY )의 진단 결과입니다.  간혹, 개발자들 중에는 이 매크로들에 대해 좋지않은 이미지가 있을지도 모릅니다만,  하지만, 이들은 개발자에게 디버그를 돕는 고마운 매크로 라는것은 부정할수는 없습니다.

ASSERT, VERIFY가 제공하는 진단 결과는, 실행 파일, 원시 파일명, 행을 표시해 줍니다. (참고로, 진단 결과는 디버그 환경만에서만 표시됩니다.)

 

ASSERT, VERIFY 의 차이는?

ASSERT는, 디버그 환경에서만 실행되며, 릴리스 환경에서는 해당 매크로가 생략됩니다.

ex)
int a = 1;
ASSERT(a > 5);

 

VERIFY는, 빌드 환경에 좌우되지 않고 식의 평가가 이루어집니다. 예를 들어, 아래와 같이 파일을 카피하는 API의 반환값에 VERIFY를 사용했는데, 이경우, 디버그나 릴리스 환경에서 모두에서 파일의 복사는 행해집니다.

ex)

 VERIFY(CopyFile("test.txt","test2.txt",TRUE));

 

TRACE

사용법>

TRACE( "%s is %d years old", "Codein", 2); // 사용법은 printf와 흡사합니다.

 

 

DOS 시대에 프로그램을 디버깅 하기 위해서, 손쉽게  printf("test") 등을 사용하여, 문자열을 화면에 출력하였습니다. 하지만, 윈도우즈 프로그래밍 시에는 콘솔창을 띄우지 않는 경우가 많아져서, 이를 별로 이용하지 않게 되었습니다.

대신, vc++은 vc++내 출력 창에 문자열을 출력할수 있는 기능을 가지는 함수를 제공 하고 있는데, 바로 OutputDebugString()를 사용하면, VC++의 출력 윈도우에 디버그용 문자열을 출력할 수 있습니다.

 

하지만, 일반적으로, 프로그래머들은 OutputDebugString() 보다 TRACE 매크로를 많이 사용합니다. 이유는?

TRACE가 printf 처럼 서식을 설정할 수 있고, DEBUG 빌드시 밖에
동작하지 않기 때문에 사용이 편리합니다.

 

예)

int i = 1;
char sz[] = "one";
TRACE( "Integer = %d, String = %s\n", i, sz );

(참고로, TRACE 매크로도 내부적으로는 OutputDebugString를 사용하고 있습니다)


그런데, TRACE를 통한, 문자열 출력이 VC++로부터 디버그 했을 때 밖에 출력하지 않는다고 생각하는 분도 계실거 같은데요. 실은 그렇지 않습니다. 이것들은 디버거에 대해서 출력되므로, 만일 밖에 디버거가 있으면,  실행하고 있는 프로그램의 OutputDebugString()를 볼 수 있습니다. 이를 이용해서, 디버그모드로 빌드되서, 실행중인 프로그램의 OutputDebugString()를 통한 문자열 정보를 캐치해서 엿보게 하는 프로그램도 존재 합니다.

 

<출처> http://jjangss.blogspot.com/2007/02/assert-verify-trace.html

안녕하세요.

이번에는 대망의! Taskkill 을 해보겠습니다.

Taskkill 은 프로세서를 종료 시킴으로써..

아주 좋은 역할을 해줍니다.

Taskkill 을 읽어보고 한번 쓸만한것들을 추려보았습니다.

옵션

내용

/IM [이미지 이름]

종료할 프로세스의 이미지 이름을 지정합니다.

와일드카드 문자 '*'를 사용하여

모든 작업 또는 이미지 이름을 지정할 수 있습니다.

/PID [프로세스_ID]

종료할 프로세스의 PID를 지정합니다.

TaskList를 사용하여 PID를 얻을 수 있습니다.

/F

프로세스를 강제로 종료하도록 지정합니다.

/T

지정된 프로세스와 그 프로세스로부터 시작된

모든 자식 프로세스를 종료합니다.


이 실험은 cmd창 으로만 실습 하도록 하겠습니다.

/IM 옵션

IM [이미지 이름] 이라고 되어있습니다.

이미지 이름이라고 하니까.. 더욱 햇갈리는대요..

이것은 종료하려는 프로그램을 뜻한다고 보시면 되겠습니다.

먼저 notepad 명령어를 이용해서 메모장을 켜주도록 합시다.

taskkill /IM [종료시키고자 하는 프로그램]

"PID 6584 에 종료 신호를 보냈습니다. " 라면서 정상적으로 종료 되었습니다.

여기서 PID 란 뭘까? 라고 생각하실 수있습니다.

★PID 란

PID (Process identification)

프로세서 아이디 입니다.

하나 하나의 프로그램 마다 각각의 아이디가 있다고 보시면 되겠습니다.


/PID 옵션

Pid 옵션은 PID로 종료를 시키겠다는 것입니다.

PID는 tasklist를 통해서 알아낼수 있습니다.

https://blog.naver.com/zlatmgpdjtiq/221404289486

배치파일 7 - tasklist & 반복문(for)

안녕하세요. 배치파일에서 반복문을 해볼까합니다. 먼저 Tasklist 에 대해서 먼저 해보겠습니다. Tasklis...

blog.naver.com

저는 PID를 이용해서 메모장을 종료시켜보도록 하겠습니다.

먼저 Tasklist를 통해서 Pid를 확인해 줍시다.

저는 notepad(메모장) 이 4692 라는 PID를 가지고 있네요

Taskkill /pid [pid번호]

정상적으로 메모장이 종료 되었내요.


/F 옵션

이 /F 옵션은 아주 ... 위험합니다.

강제이기 때문에 자주 쓰는것을 권장하지는 않아요.

taskkill /IM [종료시키고자 하는 프로그램] /F

정상적으로 프로세스가 종료가 되었내요.


/T 옵션

이 /T 옵션은 실습하기엔 좀 .. 복잡해서

이론적으로 설명드리겠습니다.

하나의 프로그램을 실행시키면 다른 프로세서가 실행되는 경우가 있습니다.

그래서 자식 프로세서 와 부모 프로세서로 구분이 됩니다.

부모 프로세서가 실행중인대, 자식 프로세서 하나가 강제로 종료 된다면..

갑자기 컴퓨터가 멈출수도 있는 현상이 발생하게 됩니다.

예를 들어

게임에서 어떠한 타워를 지켜야하는대, 게임 시작하자마자 타워가 없는것이죠..

그러면 그후 게임 진행이 어떻게 될지는 아무도 모릅니다..

이런 현상을 방지하기 위해서 /T 옵션이 있다.. 보면 되겠습니다.


그러면 이상으로

배치파일 18 - Taskkill (프로세서 종료)

을 마치겠습니다.

[출처] 배치파일 18 - Taskkill (프로세서 종료)|작성자 Whale쇼

2010버전 이후 : 코드를 드래그한 후 Ctrl + k + f

2010버전 이전 : Alt + F8