바로 이전 글에서 "디버깅 옵션으로 컴파일하니 문제가 없어져요"와 같은 주장을 엉뚱하다고 써놓고 제가 바로 그런 실수를 했네요. :-| 물론 이전 글과 같이 multi-threading 환경에서의 문제는 미묘한 타이밍 문제를 말하는 것이었지만 제가 한 실수는 바로 assert()와 관련이 있습니다.
모든 C/C++ 책들에서 경고하듯이 assert() 안에는 실제 동작해야 하는 코드가 들어가서는 안되죠. 제가 한 실수는 바로 아래 보이는 코드입니다.
서버로부터 오는 ping 메시지에 응답하는 thread를 동작시키는 코드입니다.
몇 주전 코드 테스트시에는 -g 옵션이 있어 이 코드가 제대로 동작을 했지요. 그런데 실제 환경에서 실행시켜보니 정확히 3분 30초마다 connection이 끊겼습니다. 서버와 클라이언트 사이의 ping 메시지에 문제가 있다고는 생각했지만 이전에 테스트했던 코드라 코드에 문제가 있으리라곤 생각도 안했지요.
정말 사람 눈에는 믿는대로 보이는 것인지 문제의 라인을 여러번 훑어 봤지만 보이질 않더군요. 결국 퇴근해서 집에 가는 버스안에서 생각이 나서 다음날 수정할 수 있었습니다.
물론 아직 제가 만들어서 저희 팀내에서만 테스트하는 코드라 큰 문제는 없었지만 옆 팀까지 사용하고 난 이후에 발생했으면 좀 부끄러웠겠네요. :roll:
한가지 더... 왜 assert는 NDEBUG일때만 동작하는 유일한 매크로이면서 ASSERT와 같이 대문자를 사용하지 않았는지 좀 원망스럽습니다. :-x
모든 C/C++ 책들에서 경고하듯이 assert() 안에는 실제 동작해야 하는 코드가 들어가서는 안되죠. 제가 한 실수는 바로 아래 보이는 코드입니다.
assert(pingback_.activate());
서버로부터 오는 ping 메시지에 응답하는 thread를 동작시키는 코드입니다.
몇 주전 코드 테스트시에는 -g 옵션이 있어 이 코드가 제대로 동작을 했지요. 그런데 실제 환경에서 실행시켜보니 정확히 3분 30초마다 connection이 끊겼습니다. 서버와 클라이언트 사이의 ping 메시지에 문제가 있다고는 생각했지만 이전에 테스트했던 코드라 코드에 문제가 있으리라곤 생각도 안했지요.
정말 사람 눈에는 믿는대로 보이는 것인지 문제의 라인을 여러번 훑어 봤지만 보이질 않더군요. 결국 퇴근해서 집에 가는 버스안에서 생각이 나서 다음날 수정할 수 있었습니다.
물론 아직 제가 만들어서 저희 팀내에서만 테스트하는 코드라 큰 문제는 없었지만 옆 팀까지 사용하고 난 이후에 발생했으면 좀 부끄러웠겠네요. :roll:
한가지 더... 왜 assert는 NDEBUG일때만 동작하는 유일한 매크로이면서 ASSERT와 같이 대문자를 사용하지 않았는지 좀 원망스럽습니다. :-x
버스안에서까지 디버깅을 하시다니... 대단하세요~
ReplyDeleteps. 켁.. 덧글 남기기가 어렵네요.... 덧글창이 저~~ 아래 붙어있네요
버스 안에서 디버깅한건 아니구요 그냥 갑자기 생각이 난거죠. :-)
ReplyDelete덧글 창 문제는 아마 IE6에서만 문제가 생기나 봅니다. Firefox랑 IE7 사용중인데 별 문제가 없어 보이거든요. 테스트는 못해보지만 width 살짝 수정했습니다. 제가 만든 스킨(이글루스 copy)이라 문제들이 좀 많아요. :-)
저도.. 지하철에서 설계하거나 디버깅하는일이 종종....
ReplyDelete(특히 퇴근할때 생각나면 눈물나요.. 혹시 까먹을까봐...)
assert.. 잘못쓰면 눈물나죠. /엉엉
전 주로 퇴근 버스 안에서 책을 좀 읽고 잠을 잡니다. 주로 잠이랄까요? :-)
ReplyDelete특히 원서를 읽다 보면 딴 생각이 잘 드는데 :-| 그럴 때 이런 문제들이 많이 해결되는 것 같아요.