2013-05-07 2 views
5

내가 분석하려고하는 크래시 덤프가 있습니다 (VC++ 2010).템플릿 매개 변수에 관계없이 어떤 std :: map 메서드가 동일하고 기호를 공유 할 수 있습니까?

myapp.exe!std::_Tree<std::_Tmap_traits<unsigned int,StructB,std::less<unsigned int> ... >::_Erase(...) 
myapp.exe!std::_Tree<std::_Tmap_traits<unsigned int,StructA,std::less<unsigned int>,... >::clear() 

참고의 차이 (지우기()() _erase를 호출) :

그때 (내가 가독성 여기를 많이 손질 한) 같이 보이는 호출 스택을 값의 템플리트 매개 변수 (StructA 대 StructB). 이제 정확히 동일한 바이너리를 가진 여러 가지 메소드가 실제로 다른 코드를 사용하더라도 PDB에서 동일한 심볼을 가질 수 있다는 것을 알고 있습니다. 이 경우가 여기에 해당한다고 가정합니다 (std :: map :: _ Erase는 값 유형과 상관없이 동일합니다).

하지만 어떻게 알 수 있습니까? 이것이 적용되는 stl 메소드 (이 MS 구현의 경우) 목록이 있습니까? 그것은 일종의 버그 일 수 있습니까?

업데이트

(텍스트 편집기)를 PDB에 찾고

, 나는> :: _ ... 지우기를 여러 표준 : :지도 <를 참조하십시오 특히 나는 StructA 및 StructB 모두를 참조하십시오. 나는 그것이 접는 것에 대해 어떤 의미인지 모른다.

또한 std :: map의 디스 어셈블 된 코드는 std :: map으로 해석되는 주소에 대한 호출을 보여줍니다. 이 평균 코드 접기 같아요 ...

+0

아마도 당신이 exe/dll을 의존성 워커와 함께 열면 모든 _Erase 심볼을 찾아 실제로 두 개 있는지 확인할 수 있습니다. 나는 이것을 직접 확인하려하지 않으므로이 경우에 도움이된다면 경험으로 말할 수는 없다. – selalerer

답변

0

글쎄, 나는 맵 파일을 만드는 재건 끝났다. 지도 파일에서 두 메서드 (_Erase for StructA와 _Erase for StructB)가 동일한 주소를 가지고 있음을 알 수 있습니다. 그래서 버그가 아닙니다.

1

코드 접기 동작을 사용하지 않으려면 /OPT:NOICF을 사용할 수 있습니다.

http://msdn.microsoft.com/en-us/library/bxwfs976%28v=vs.80%29.aspx

+0

감사합니다. 사후에 그렇게 할 수있는 방법이 있습니까? 또는 적어도 접혀있는 함수를 출력하기 위해 컴파일러를 얻거나 함께 접는 것을 건너 뛰었습니까? – Asaf

+0

@Asaf : 가장 신뢰할 수있는 버전은 외부 유형입니다. 실제 유형에 따라 코드가있을 가능성이 가장 높기 때문입니다. 여하튼, 너무 많이 다른 맵 유형을 사용하지 않는 표준 라이브러리 안에없는 첫 번째 심볼을 찾으십시오. –