문제

특정 작업을 수행 할 때 경험하는 고객이 프로그램을 개발했습니다.이것은 항상 동일한 위치에 있고 동일한 데이터에서 일어나고 있으며, 더욱이, 지역 개발기도 나의 테스트 가상 컴퓨터 (모든 개발 장비가 없어짐)에서 일어나지 않습니다.

이러한 조건을 감안할 때 맵으로 컴파일하기로 결정했습니다 (등록 정보 -> 링커 -> 옵션 / 맵이있는 디버거 구성)을 사용하여 충돌을 일으키는 기능을 확인합니다.

제가 올바르게 이해할 경우 프로그램이 크래시가 발생하면 오프셋 오류를 확인한 다음 rva + base 열 아래에서 내지도에서 검색하십시오.

     Address                         Publics by Value                                      Rva+Base       Lib:Object
 0001:00037af0       ?PersonalizzaPlancia@CDlgGestioneDatiProgetto@MosaicoDialogs@@IAEXXZ 00438af0 f   DlgGestioneDatiProgetto.obj
 0001:00038000       ?SalvaTemporanei@CDlgGestioneDatiProgetto@MosaicoDialogs@@IAEXXZ 00439000 f   DlgGestioneDatiProgetto.obj
.

실제로, 내 충돌은 오프셋에서 발생합니다.

00038C90
그래서 메서드 어딘가에 있다고 생각해야합니다 :

MosaicoDialogs::CDlgGestioneDatiProgetto::PersonalizzaPlancia
.

그러나 이것은 절대적으로 가능하지 않으므로 컴퓨터가 틀릴 수 없다고 가정합니다. 나는 그것을 나쁘게하는 사람입니다.

누군가가 올바른 방법으로지도를 읽는 방법을 설명 할 수 있습니까?

도움이 되었습니까?

해결책

맵 파일의 읽기이 코드 프로젝트 문서에서 충돌 위치를 멋지게 설명합니다.

http : //www.codeproject.COM / 기사 / 3472 / 찾기 - 크래시 - 정보 사용 - 맵 파일

희망은 도움이됩니다.

다른 팁

귀찮게하지 마십시오. 대신 기호로 프로젝트를 빌드하고 PDB 파일로 스트립하십시오.

프로그램을 조금 수정하고, 처리되지 않은 예외 처리기

새로 컴파일 된 프로그램을 고객에게 제공하고, MinIdUmpWritedump 호출에 충돌 할 때.

고객 에게이 .dmp 파일을 보내려면 Visual Studio (또는 Windbg)에로드하기 만하면 프로그램에 기호가 일치하며 코드와 일치합니다. 당신은 관련된 코드와 관련된 변수의 정확한 코드와 일부를 볼 수 있어야합니다. (vs를 사용하는 경우 .dmp 파일을로드하면 오른쪽 상단의 오른쪽 상단 모서리가 "디버깅 시작"옵션이 클래스의 시점에서 '디버깅 시작'을 클릭합니다.

먼저 로컬로 시도해보십시오 - 프로그램의 어딘가에 오류를 0으로 올려 놓고 실행 된 후 덤프를 디버그 할 수 있는지 확인하십시오. 프로그램의 각 빌드에 대해 똑같은 기호 파일을 유지해야합니다. 아무 것도 변경되지 않더라도 하나의 빌드가 다른 빌드와 일치하도록 기호 파일이 기대할 수 없습니다.

이런 종류의 튜토리얼이 있습니다. CodeProject에서 필요한 것을 설명하는 것처럼 보이는 에서

Postmortem 디버깅을 위해 not 에 대한 대안이 맵 파일을 사용해야합니다. 오히려 일부 wer (Windows 오류보고) 크래시 덤프 파일을 트랩하는 플래그입니다. 먼저 디버그 기호로 응용 프로그램을 작성하십시오. 그런 다음 수집에 대한 지침을 따르십시오. 사용자 모드 덤프 . 기본적으로 "LocalDumps"키 아래에 하위 키를 만듭니다. 이 하위 키 에 "myApplication.exe"와 같이 응용 프로그램의 이름이되어야합니다. 그런 다음 "dumpCount", "dumptype"및 "dumpfolder"키 / 값을 만듭니다. 사용자가 레지스트리 스크립트를 실행하게하십시오. 이렇게하면 덤프를 로컬로 트래핑 할 수 있습니다. 그런 다음 사용자가 덤프 파일을 수집하도록 충돌을 강요하게하십시오. 그런 다음 사용자가 작성한 기호를 사용하여 디버깅 할 덤프 파일을 보내서 덤프 파일을 보낼 수 있습니다. 마지막으로 레지스트리에 추가 한 키 / 값을 제거하는 레지스트리 스크립트를 만들어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top