잘못된 인수가 발견되었습니다(An invalid argument encountered)

2015. 8. 18. 13:46IT-개발/winapi 및 MFC

반응형


내가 MFC로 만든 프로그램 소스에 


잘못된 인수가 발견되었습니다(An invalid argument encountered) 라는 메세지가 나오도록 설정한 소스가 없음에도


다음 그림과 같은 메세지가 나오는 현상이 정말 간혹 있다.... 그 당혹스러움은~~



그럴 때에는 몇가지 이유가 있지만 다음 사례중에 하나 인듯하다. 가장 유력한 내용은 1번째 내용이다.


1.. (펌) anscii code 상에 화면에 나오지 않는 문자 코드값을 string에 사용. - MFC 관련 함수를 의심해서 찾아내자


한국어로 "잘못된 인수가 발견되었습니다", 영어로 "An invalid argument was encountered"

보통 MFC에서 존재하지 않는 리소스에 접근할때 접하는 에러이다...

 

그런데 다른경우에도 이 에러가 발생할 수 있다...

 

그 다른경우에 발생하는 이 빌어먹을 에러 메시지 때문에 며칠을 고생했는지...

 

상황은 이렇다...

소켓으로 유량계와 MODBUS RTU 방식으로 24시간 통신을 하고 있는 상황(시리얼통신이라고 이해해도 좋다)  이틀에 한번꼴로 상기 에러 메시지가 발생한다...재밌는건 저 메시지가 떠있을뿐 프로그램은 정상적으로 동작하고 있다. 물론 난 저런메시지를 뱉도록 코딩한적이 없다...한마디로 왜, 어떤 상황에서 저 메시지가 뜨는지 찾기가 힘든 상황...

 

배열에서 범위를 벗어났을때 저런 메시지가 난다고 하는 블로그가 있길래 strcpy, memcpy 같은 함수를 열라 뒤졌지만 상식적으로 저런 함수가 상기 메시지같은 예외오류를 낼 수는 없다...

 

결국 의심되는 모든 사용자 함수에 try, catch(CException* e)를 쓰면서 범위를 좁혀가다보니 일주일만에 결국 찾았다...

 

특수기호가 있는 문자열에서 CString의 MakeLower() 또는 MakeUpper()를 사용했을때 발생했다.

 

이 경우가 상기 에러메시지가 발생하는 모든 경우라고는 말 할수는 없겠지만 적어도 한가지 확실한 예와 비슷한 문제가 발생했을때 원인을 찾아갈 수 있는 방법을 올려놓는다. (행운이 있길 바란다)

 

"잘못된 인수가 발견되었습니다"라는 에러 메시지가 발생하는 경우의 예

char szMsg[256] = {0, };
BYTE byteData[256] = {0, };

for(int i = 0; i < 255; i++)
     byteData[i] = i+1;

memcpy(szMsg, byteData, 255);

CStringA strMsg = szMsg;
strMsg.MakeLower(); //여기서 예외상황이 발생한다

 

원인을 찾아가는 방법

 

1. MFC에서 사용되는 함수를 의심한다

2. 의심되는 사용자 함수를 try, catch로 묶어가면서 에러가 발생하는 함수의 범위를 좁혀나간다

(상기 에러메시지가 발생할때는 CException* e로 예외에러를 throw 시킨다)



2. IP 또는 해당 포트가 없으면 발생하는 것 같습니다



3. MFC Code쪽에서 발견되는 듯~


 - 아래와 같은 코드에서 CCommandLineInfo::FileOpen; 으로 입력되고, 파일 이름에 위에서 문제가되는 1번항목 코드의 문자가 들어있는 경우. File을 Open 하려는 동작을 실행하다가 나오는 듯~


CCommandLineInfo cmdInfo;

ParseCommandLine(cmdInfo);


cmdInfo.m_nShellCommand=CCommandLineInfo::FileNew;

cmdInfo.m_strFileName=_T("");


if(!ProcessShellCommand(cmdInfo))

return FALSE;


(참고)

// MFC Standard Exception Error messages

 

#define AFX_IDS_INVALID_ARG_EXCEPTION   0xF025

...

AFX_IDS_INVALID_ARG_EXCEPTION "잘못된 인수가 발견되었습니다."

 

와 같이 정의되어 있었습니다.



=================================================================================================


직접 검증해본건 (1)항목 뿐이긴 하나 지인들은 (3)도 확인됐단다~