증상
Visual Studio 2008에서 디버깅하던 중 갑자기 디버거와 응용 프로그램이 한번에 죽었다. 어라? 비주얼 스튜디오 버그인가? 이렇게 생각하고 다시 디버깅하다 또 죽는다. 세 번째 도전 역시 실패했다. 혹시나 싶어 디버그를 붙이지 않고 응용 프로그램을 돌렸다. 정상이다. 뭔가 본질적인 문제가 있음을 깨닫는다. 출력 창에 뜬 디버거 종료 코드 –2147023895 으로 검색해 보고 다음과 같은 결론을 얻었다.
원인
종료 코드 2147023895 은 스택 오버플로우다. 그러나 스택 오버플로우를 내고 죽은 지점은 별다를 게 없다. 객체가 널인지 아닌지 확인했을 뿐인데 스택 오버플로우라니, 보다 심오한 원인이 있을 것 같다. 또 다시 구글링. 그리고 다시 깨달음을 얻었다.
[비주얼 스튜디오 – 도구 – 옵션 – 디버깅 – 일반 – 속성 확인 및 기타 암시적 함수 호출 사용 – 변수 창의 개체에서 문자열 변호나 함수 호출(C# 및 JavaScript 전용)] 이란 메뉴가 있다. 이야기인 즉, 디버거가 변수의 ToString() 메서드를 자동 호출한다는 것이다. 그러니 ToString()에 버그가 있으면 디버거가 죽게 된다.해당 디버거 옵션을 제거해 보니 증상이 사라졌다. 즉, 십중팔구 ToString() 구현이 틀린 것이다. 지금은 원인을 찾아서 고치는 중이다.
Author Details
Kubernetes, DevSecOps, AWS, 클라우드 보안, 클라우드 비용관리, SaaS 의 활용과 내재화 등 소프트웨어 개발 전반에 도움이 필요하다면 도움을 요청하세요. 지인이라면 가볍게 도와드리겠습니다. 전문적인 도움이 필요하다면 저의 현업에 방해가 되지 않는 선에서 협의가능합니다.
그래서, 저는 obj.ToString() 메쏘드보다는 가급적이면 Convert.ToString(obj) 형태로 쓴답니다. 최소한 이건 obj 값이 널이면 null 값을 리턴시키니깐용. 머… 그것도 경우에 따라 다르긴 하겠습니다마는…
음. 이번엔 NULL 예외 정도가 아니라 스택오버플로우라서 버그 잡느라 고생했죠. 덜덜덜…
재미있는 현상이네요 이런것도 있었네요^^ 마치 조사식에 함수를 넣었더니 step over 때마다 함수가 호출되는 거랑 비슷하네요. 잘 알고 써야한다는거~ 의도치 않은 동작을 해줄 때가 있다는 거~ ㅋ
신기한 현상이라 하면 x64 윈도우에서 C++/CLI를 써서 C#과 네이티브 C++을 묶으면 정말 많습니다. 특정 옵션 하나 때문에 디버거가 작동하고 안 하고, 누구는 디버깅이 되는데 누구는 안 되고 등등. 정확한 원인을 찾으면 이것도 글로 적어보겠습니다. ㅋㅋ