본문 바로가기

Windows/MFC

WinCE Debugging Tips using MAP file and Debugdump



http://unknown.textcube.com/9

사실 WinCE에서 특히 폰에서 테스트 할 경우 abort가 났을 경우 딸랑 address정보만 나타나기 때문에(디버깅 모드에서나 로그가 있을 때는 안죽다가 릴리즈로 컴파일할때 꼭 죽는 경우가 많더군요...) 어느 함수에서 죽었는지 판단하기가 쉽지 않습니다. 그래서 주로 Map을 이용해서 디버깅을 많이 하게 됩니다. 아래 4가지 문서만 알고 있어도 printf디버깅으로 찾기 힘든 버그를 찾는데 도움이 많이 됩니다.

특히 qualcomm 1 chip(MSM7XXX)에서 동작하는 Windows Mobile의 경우 active process는 bank0(32MB)에서 전부 돌게 되는데  극악의BSP로 인해 할당된 RAM이 많이 모자라게 됩니다. 특히 DLL을 많이 쓸 경우 process switch중 DLL crash 현상이 많이 발생하고요.(process가 suspend될 경우 bank1으로 옮겨지게 되는데 다시 process가 active되면서 bank0으로 이동하게 됩니다. 이 때 기존에 다른 process가 사용하는 메모리를 침범할 수 있다고 하네요.) 이를 해결하려면 lib를 DLL로 만들기 보다는 static lib으로 해서 한방에 메모리에 올라갈 수 있도록 하는게 좋다고 합니다. 단, 현재 아마도 qualcomm bsp가 많이 안정화되어있을꺼라 판단이 되기에 저런 경우도 있구나 참고만하세요.

 

Resolving Symbols Manually on Windows CE (ADDRESS --> SYMBOL)

http://blogs.msdn.com/sloh/archive/2005/02/28/381706.aspx

 

Printed Exception strings - what do all those flags mean?

http://blogs.msdn.com/hopperx/archive/2005/06/29/433842.aspx

 

Using MAP files - part 1

http://blogs.msdn.com/hopperx/archive/2006/09/14/754772.aspx

 

Finding crash information using the MAP file

http://www.codeproject.com/debug/mapfile.asp

 

 

 내용 보강)

 

1. 디버그 로그 받기


첨부한 DebugDump.zip 파일을 보시면 DebugDump.exe 파일이 들어있습니다.
이 파일을 단말의 My Document 밑에 복사하십시오.
abort 가 발생하면, debugdump.exe 를 실행하시고, dump start 버튼을 누르셔서 시리얼로그를 파일로 dump 합니다.
그러면 My Document 밑에 첨부한 debug.txt 같은 파일이 생깁니다.
 
2. abort 로그 찾기
debug.txt 파일을 여시고 "DebugDump.exe" 라는 문자열을 찾으십시오.
"DebugDump.exe" 위로 다시 "abort" 문자열로 찾으시면 나오는 abort 들이 debugdump.exe 로 디버그덤프 받기전에 발생한 abort 입니다. 동일 지점에서의 abort 는 제외했습니다.
    424647: Data Abort: Thread=83dfa400 Proc=80358b80 'XXX.exe'
    424647: AKY=00040001 PC=0022b9b0(XXX.exe+0x0021b9b0) RA=002185cc(XXX.exe+0x002085cc) BVA=2600000a FSR=00000001
    424667: RaiseException: Thread=83dfa400 Proc=80357f50 'gwes.exe'
    424667: AKY=00040021 PC=03f6c3c4(coredll.dll+0x0001e3c4) RA=80009758(NK.EXE+0x00009758) BVA=00000001 FSR=00000001
 
    569497: Data Abort: Thread=844945f8 Proc=80358b80 'XXX.exe'
    569498: AKY=00040001 PC=002365bc(XXX.exe+0x002265bc) RA=002185cc(XXX.exe+0x002085cc) BVA=26000011 FSR=00000001
    569509: RaiseException: Thread=844945f8 Proc=80357f50 'gwes.exe'
    569509: AKY=00040021 PC=03f6c3c4(coredll.dll+0x0001e3c4) RA=80009758(NK.EXE+0x00009758) BVA=00000001 FSR=00000001
 
    735903: Data Abort: Thread=8383d740 Proc=80358b80 'XXX.exe'
    735903: AKY=00040001 PC=00236cec(XXX.exe+0x00226cec) RA=0080c4f0(XXX.exe+0x007fc4f0) BVA=2780ad60 FSR=00000807
    735918: RaiseException: Thread=8383d740 Proc=80357f50 'gwes.exe'
    735919: AKY=00040021 PC=03f6c3c4(coredll.dll+0x0001e3c4) RA=80009758(NK.EXE+0x00009758) BVA=00000001 FSR=00000001
 
3. abort 분석하기
이 내용은 제가 말씀드리는 것보다 아래 URL 의 내용이 더 좋습니다.
Resolving Symbols Manually on Windows CE (ADDRESS --> SYMBOL)

http://blogs.msdn.com/sloh/archive/2005/02/28/381706.aspx

 

Printed Exception strings - what do all those flags mean?

http://blogs.msdn.com/hopperx/archive/2005/06/29/433842.aspx

 

Using MAP files - part 1

http://blogs.msdn.com/hopperx/archive/2006/09/14/754772.aspx

 

Finding crash information using the MAP file

http://www.codeproject.com/debug/mapfile.asp 


아래 로그는 AAAA 에 반영된 XXX 실행 파일의 map 파일중 일부입니다. abort 로그는 아래의 것으로 사용하겠습니다.
    735903: Data Abort: Thread=8383d740 Proc=80358b80 'XXX.exe'
    735903: AKY=00040001 PC=00236cec(XXX.exe+0x00226cec) RA=0080c4f0(XXX.exe+0x007fc4f0) BVA=2780ad60 FSR=00000807
    735918: RaiseException: Thread=8383d740 Proc=80357f50 'gwes.exe'
    735919: AKY=00040021 PC=03f6c3c4(coredll.dll+0x0001e3c4) RA=80009758(NK.EXE+0x00009758) BVA=00000001 FSR=00000001
 
위의 abort 로그를 보면 PC 와 RA 값이 있는데, PC 는 abort 가 일어난 지점이고, RA 는 해당 PC 지점을 호출한 함수입니다.
map 파일에서 해당 주소를 찾아봤는데 RA 는 소스영역이 아닙니다.
PC 의 경우는 소스영역인데, PC 값인 0x00236cec 로 찾아보면 아래와 같이 funA, funB 함수 사이입니다.
이 의미는 funA 함수의 어딘가에서 abort 가 발생하였다는 것입니다.
 0001:00225b54       funA                 00236b54 f   test:mem.obj
 0001:00225d1c       funB                   00236d1c f   test:mem.obj
 
그래서 abort PC 지점 주소 00236cec - map 파일 상 함수 시작 주소 00236b54 = 0x198 이 나옵니다.
여기서 funA 함수 내부의 어디인지를 찾으려면 cod 파일이 필요합니다.
cod 파일을 만드시려면 Visual Studio 에서 빌드를 하실 때에 Project properties 를 아래 그림을 참조하시어 변경하시기 바랍니다.


mem.cod 파일을 만드시고, funA| Proc 이런 라인을 찾으십시오. 이 라인이 해당 함수가 컴파일된 첫번째 위치입니다.
cod 파일에 보면 각 소스 라인마다 컴파일된 어셈블러 코드가 보이고, 좌측에 hex 값으로 각 어셈블러 코드의 함수 시작부터의 offset 이 보입니다.
이 offset 이 198 인 라인을 찾으시면 abort 가 일어난 라인을 찾으실 수 있습니다.

'Windows > MFC' 카테고리의 다른 글

Playing Audio in Windows using waveOut Interface  (0) 2013.10.02
WaveOut api  (0) 2013.10.02
Debugging Windows Mobile 6 Applications with IDA  (0) 2013.10.02
debuging on windbg  (0) 2013.10.02
crash checking map  (0) 2013.10.02