내 사용자 중 일부가 내가 분석하고자하는 드문 AccessViolations를보고했습니다.지도 파일에서 AccessViolation의 주소 확인
나는 정확히 그 Build의 소스 코드를 가지고 있으므로 MAP 파일을 만들 수있다. 그러나 MAP 파일에서 AccessViolation이 제공 한 주소를 찾는 방법을 모르겠습니다.
(향후 JclDebug와 같은 프레임 워크를 사용하여 유용한 스택 트레이스를 만들려고합니다.)
procedure CrashMe;
var
k: TMemo; a: TButton;
begin
k.Text := 'abc';
k.Color := clBlack;
k.Assign(a);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
CrashMe;
end;
액세스 위반은 다음과 같습니다 :
, 나는 다음과 같은 내용을 찾을 :주소 004146CF
나는 설정을 예를 들어 있습니다. 주소 B2D88B53에서 읽기. 맵 파일에서
Start Length Name Class
0001:00401000 000556A8H .text CODE
0002:00457000 00000770H .itext ICODE
0003:00458000 00001B0CH .data DATA
0004:0045A000 00004CCCH .bss BSS
0005:00000000 00000038H .tls TLS
....
0001:000552F0 Unit1..TForm1
0001:00055498 Unit1.CrashMe
0004:00004CC8 Unit1.Form1
0001:000554C8 Unit1.TForm1.Button1Click
맵 파일이 0001라고하면서 왜 AV는 주소 004146CF은 말하는가 : 00,055,498를?
CODE 세그먼트 (0001)의 시작 주소를 뺄 경우에도 여전히 004146CF-00401000 = 136CF를 얻습니다. 이는 내가 찾고있는 것이 아닙니다.
또한 ": 00414"문자열을 검색하여 오류 주소를 찾으려고했지만 아무것도 찾지 못했습니다.
어떻게 MAP 파일의 AV에서 주소를 조회 할 수 있습니까?
사람들이 질문을 downvote 할 때 너무나 싫어합니다. 질문에 무엇이 잘못되었는지 알려줍니다. 나는 몇 시간 봤 거든이 메모리 주소 사이에 올바른 변환 기법을 찾지 못했습니다. –
Jedi Code Library에서 코드를 검색 할 수 있습니다.그러나 실제로지도 파일에 제공된 주소 범위를 검색하는 종류입니다. 예외가 발생한 장소에 대해 얼마나 정확하게 말할 수 있는지지도 파일 (라인 번호 또는 루틴에 대한)의 detalization에 달려 있습니다 ... 하지만 주로 JvDebugHandler를 사용할 수 있습니다 - 이미 완료된 모든 것이 있습니다! –
앱에 중단 점을 넣고 중단 점에 도달 할 때까지 ot를 실행합니다. 그런 다음 IDE에서 검색 | 오류를 찾아 주소를 입력하십시오. – MartynA