컴퓨터/C#

[VS10] 사용 가능한 소스 없음, PDB가 이미지와 일치하지 않습니다.

dolhim 2016. 2. 22. 12:27

문제 : 

프로젝트에 dll 파일을 참조하였다.  그리고, 해당 dll에 대한 소스 파일을 디버깅하기 위하여 빌드할 때 만들어진 pdb 파일을 같은 경로에 두었다.

그런데 디버깅 중, 해당 모듈을 사용하는 곳에서 소스가 로드되지 않고 '사용 가능한 소스 없음' 창이 떴다.



자세한 정보를 얻기 위하여 

아래 이미지와 같이 호출 스택에서 기호 로드 정보를 도시하였다.



그러면, 아래와 같은 PDB 기호 로드 정보 창이 도시된다. 



내용을 보면 'PDB 파일을 찾거나 열 수 없습니다.' 와 같은 내용이 대부분이지만, 

첫번째 줄에서 'PDB가 이미지와 일치하지 않습니다.'라는 문구를 볼 수 있다. 

첫번째 줄의 경로에서 PDB 파일을 찾았지만 모듈 파일과 무언가 정보가 일치하지 않는다는 것 같다.



해결 방법 :

아래 문구로 검색하여 결과를 찾았다.

에러 KeyWord : 'PDB가 이미지와 일치하지 않습니다'

ENG : 'PDB does not match image.'


아래는 관련 내용을 찾은 링크이다.


위 글을 참고하여 ChkMatch 라는 파일을 다운받았다. 

모듈과 pdb 파일을 로드하면 두 파일을 비교한 정보를 보여준다.

파일 설명 및 다운로드 : http://www.debuginfo.com/tools/chkmatch.html


사용 방법은 프로그램이 설치된 위치에서 아래와 같이 명령어를 입력하면 된다.

chkmatch -c [.exe 혹은 .dll 파일 경로] [.pdb 파일 경로]




Signature GUID 값은 빌드된 DLL에 해당하는 PDB임을 식별하는 값이다.

Age 값은 보통, Rebuild 되면 1로 초기화되고 이후 Build 될 때마다 Age 값이 증가된다. 그러면, PDB의 Age 값이 1이라는 것은 Rebuild 된 후 최초로 등록되었다는 의미이고 반면, DLL 파일은 한번 더 빌드되었다는 것을 의미한다.


그런데 나는 이미 Signature와 Age값을 확인하기 전에, dll 파일의 PdbFile 경로와 입력한 pdb 파일의 경로가 일치하지 않는 것을 확인할 수 있었다..

확인된 두 pdb 파일이 아예 관련 없는 것은 아니지만 왜 저런 결과가 나오는지 다시 확인이 필요할 것 같다.


만약에, 위에서 문제를 해결하지 못한다면, ChkMatch.exe를 사용하여 강제로 PDB와 DLL의 Signature와 Age를 일치시켜줄 수 있다.

chkmatch -m [EXE 또는 DLL 경로] [PDB 파일 경로]





문제 해결 : 

이번의 경우, 특정 모듈을 컴파일하는 방법에는 문제가 없었다.

문제는 두 개 이상의 프로젝트에서 한 모듈을 여러 버전으로 참조하고 있었기 때문이다.


여러 프로젝트 파일에서 특정 A모듈을 참조하고 있었는데, 그 중 하나의 프로젝트에서 다른 버전의 A모듈을 참조하고 있었다.

모든 프로젝트를 한꺼번에 빌드하면서, A모듈이 두번 이상 복사되었고, 내가 실행되기를 바랬던 버전의 A모듈 위에 다른 버전의 모듈이 덮어쓰여지게 되어 마치 엉뚱한 파일이 생긴 것처럼 보여지게 된 것이다.

기존에 작성되어있던 소스를 건드려서 발생하는 버그를 피하기 위한 것이였는데, 오히려 다른 버그를 생기게 한 것 같다.

라이브러리는 꼭 한가지 버전만 참조하도록 하자.