회사에서한 코딩 삽질기 -ㅁ-;
요새 회사에서 프로젝트땜에 프로세스들을 작성 중인데
기존에 다른 사람이 작성한 비슷한 일을 하는 프로세스들은
코드가 상당히 불량;; 해서 제가 새로 작성하고 있습니다.
어제 대충 코딩 작업은 마무리가 되어서 연동 테스트전에
제가 기본적인 테스트를 위해서
프로세스를 뛰워나가던 중 한놈이 뜨자 마자 계속 11번 시그널을 받고 죽더군요;
그것도 요상한게 11번 시그널을 받고 프로세스가 종료가 되어야 하는데
그냥 행업이 되고 마는 진짜 희안한 문제에 봉착하게 되었습니다.
제가 맡은 파트가 DB쪽이어서 TDD를 적용하기엔
아직 제 내공이 Mock Object같은 걸 만들기엔 부족하기도 해서
DB Query쪽 클래스는 Unit 테스트를 해보지 못한 상태에서 뛰웠더니
저런 문제가 발생하더군요 -ㅁ-;
아무튼...열심히 여러가지 상황을 생각하던중 return address가 변경이 되었고
이상한 곳으로 jump를 해서 잘못된 메모리를 건드렸기 때문에
11번 시그널을 받고 signal handler 함수를 호출한 곳으로
돌아가서 프로세스가 종료되어야 하는데
그 역시 return address가 변경이 되어서 이상한 곳으로 jump를 한 후
알 수 없는 Instruction들을 계속 수행하고 있는 즉...
그냥 프로세스는 떠있는 상태에서 아무것도 하지 못하고
그냥 떠있기만 할 것이다라는 결론을 내렸습니다.
하지만 제 코드에서는 아무 문제점을 발견할 수 없었습니다.
해당 클래스의 정의를 담고 있는 헤더 파일을 유심히 관찰하기 전에는...
아래는 제 코드의 대충의 뼈대입니다. ^^
int COraQueryUnit::HistoryMaker() { 잡다한 변수 선언; _INSERT_DATA stItem; ... 지역 변수들 초기화; memset(&stIem,0,sizeof(_INSERT_DATA)); while(true) { ... } return 0; }
메모리를 건드는 곳이라고는 memset밖에 없는데
참 이상스럽다 하면서 없어도 되는 라인을 하나하나
제거해가면서 문제점을 찾기 위해서 노력했는데 잘 안되더군요.
담배 한대 피우고 그냥 심심해서...
헤더 파일을 열어보고 순간 경악하고 말았습니다. -ㅁ-;
class COraQueryUnit : CQueryUnitBase { public: struct _INSERT_ITEM { 필요한 변수들; } }
아무 생각없이 구조체니깐..memset..했더니.....
프로세스의 메모리를 망가뜨려 버린거였더군요 --;
memset저거 대신 그냥 구조체 초기화 해주는
멤버 함수 하나 만들어서 대체하니깐 바로 문제가 해결되었습니다.
C++에서 Inner Class나 Inner Structure의 Instance를 초기화할 때
memset을 쓰면 안된다는 짤막한 글을 예전에 어디선가 본듯 했는데
그 사실을 망각하고 살다가 겪은 어이없는 문제였습니다. ㅠ.ㅠ
이 문제때문에 어제 늦게까지 회사에서 고민하다 졸려서
집에와서 오늘 일어나자마자 몇시간 동안 저 문제에 매달려 있었는데
저렇게 간단한 문제였다니...참 눈물이 나더군요 --;
P.S
Network으로 다른 프로세스와 연동되는 경우 현재 Simulator 형태의 Mock Object를 만들어서
TDD를 적용해보고 있는데 DB쪽은 어떻게 Mock Object를 만들어야 할지 감이 오질 않습니다. -ㅁ-;
경험 있으신분 조언 좀 부탁드립니다. ^^
memset을 쓰면 안됐던
memset을 쓰면 안됐던 이유가 inner structure였기 때문이 아니라 혹시 POD가 아니었기 때문은 아닌가요?
inner structure라는 이유만으로 memset을 쓰면 안된다는 얘기는 처음 들어서요.. 혹시 더 자세히 설명해 주실수 없으신지...:O
동감입니다.
---------------------------------------------
svn + trac + my project --> success ???
---------------------------------------------
---------------------------------------------
git init
git add .
git commit -am "project init"
---------------------------------------------
저두 첨
저두 첨 들어보네요... (사실 inner로 선언해서 사용해본적이 별루없어놔서 ^^;;)
저런 내용이 담겨있는 레퍼런스라도 아시나요? 있다면 진짜 주의해야될 꺼 같아서요
------------------------------------------
Let`s Smart Move!!
http://kalstein.tistory.com/
------------------------------------------
Let`s Smart Move!!
http://kalstein.tistory.com/
으
http://gpgstudy.com/forum/viewtopic.php?t=10067&highlight=
좋은 내용 다시 한번 떠올리게 해서 감사합니다.
---------------------------------------------
svn + trac + my project --> success ???
---------------------------------------------
---------------------------------------------
git init
git add .
git commit -am "project init"
---------------------------------------------