오늘 당했던 일을 먼저....
솔루션의 프로젝트 구성은 이랬다.
 
프로젝트 1 : native C++ library (unmanaged code)
프로젝트 2 : wrapper Class (managed code) 
프로젝트 3 : C#
 
이때 wrapper class에서 native 함수를 호출하면 꼭 비관리코드에서 관리코드를 읽거나 쓰려고 했다는 예외가 발생했다.
호출되는 native c++ 함수에서 브레이크포인트를 걸어보니 그곳에서 걸리지 않았다.
그럼 호출 자체가 문제가 있다는건데 라이브러리를 바로 쓰는건데 왜 호출이 안되지?
마샬링으로 넘어오는 버퍼가 관리힙에 있는 건가? MSDN 설명으로는 그렇지는 않은데...
caller가 관리코드라 비관리코드 호출 후 caller로 돌아올 때 리턴코드가 영향을 끼치나?
관리코드에서는 비관리코드를 아예 호출할 수 없는건가? 등등으로 고민했다.
 
찾아봐도 딱히 답도 없고... 짜증이 머리 꼭대기에 오를때쯤. (아니, 이미 꼭대기에 올라 있었다)
별 기대없이 호출되는 native c++의 함수 내부를 비워봤더니 정상적으로 호출이 되는것이 아닌가!
왜?!?! 젠장!! 분명히 native c++ 함수 시작 부분에 걸어 놓은 브레이크포인트에는 안 걸렸는데!!
 
다시 확인해보니, 디버깅 모드로 시작과 동시에 그 브레이크포인트는 disable 되고 있었다... orz
뭐 아직 왜 예외 메시지가 그렇게 나오는지는 모르겠다.
예외의 원인은 널포인터 참조였는데, 예외가 저딴식으로 나오면 안되지... ㅡ_ㅡ;
난 이래서 try catch가 너무 싫다.
 
검색해보니 혼합모드 디버깅 자료는 널리고 널렸더라.. 제길.
요것때문에 시간 낭비한 걸 생각하면... ㅠ_ㅠ
 
혼합모드 디버깅
1. 시작 프로젝트의 설정에서 [비관리코드 디버깅 사용] 체크
2. native c++ 프로젝트 설정에서 [디버깅 형식] 을 네이티브 or 혼합 or 자동으로


싸이 블로그 백업 [하zi 2008.09.10 16:26]

+ Recent posts