2010-03-13 5 views
1

ARMv4I 프로세서에서 실행중인 Winodws Mobile 6.1 응용 프로그램이 있습니다. 스택 주소가 주어지면 (예외를 푸는 것에서), 나는 그 모듈이 어떤 모듈을 소유하고 있는지를 알고 싶어한다. 난 항상 주소와 일치하는 모듈을 찾을 수하지 않는 것,스택 주소로 모듈 찾기

HANDLE snapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_GETALLMODS, 0); 
if(INVALID_HANDLE_VALUE != snapshot) 
{ 
    MODULEENTRY32 mod = { 0 }; 
    mod.dwSize = sizeof(mod); 
    if(::Module32First(snapshot, &mod)) 
    { 
     do { 
      if(stack_address > (DWORD)mod.modBaseAddr && 
       stack_address < (DWORD)(mod.modBaseAddr + mod.modBaseSize)) 
      { 
       // Found the module! 
       // offset = stack_address - mod.modBaseAddr 
       break; 
      } 
     } while(::Module32Next(snapshot, &mod)); 
    } 
    ::CloseToolhelp32Snapshot(snapshot); 
} 

// if it's still not found 

snapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS | TH32CS_SNAPNOHEAPS, 0); 
if(INVALID_HANDLE_VALUE != snapshot) 
{ 
    PROCESSENTRY32 proc = { 0 }; 
    proc.dwSize = sizeof(proc); 
    if(::Process32First(snapshot, &proc)) 
    { 
     do 
     { 
      if(stack_address > proc.th32MemoryBase && 
       stack_address < (proc.th32MemoryBase + 0x2000000)) 
      { 
       // Found the executable 
       // offset = stack_address - proc.th32MemoryBase 
       break; 
      } 

     } while(::Process32Next(snapshot, &proc)); 
    } 
    ::CloseToolhelp32Snapshot(snapshot); 
} 

을하지만 :

ToolHelpAPI를 사용

, 나는 다음과 같은 방법을 사용하여 대부분의 모듈을 확인할 수 있어요. 예 :

stack address  module  offset 
0x03f65bd8  coredll.dll + 0x0001bbd8 
0x785cab1c  mylib.dll + 0x0002ab1c 
0x785ca9e8  mylib.dll + 0x0002a9e8 
0x785ca0a0  mylib.dll + 0x0002a0a0 
0x785c8144  mylib.dll + 0x00028144 
0x3001d95c   my.exe + 0x0001d95c 
0x3001dd44   my.exe + 0x0001dd44 
0x3001db90   my.exe + 0x0001db90 
0x03f88030  coredll.dll + 0x0003e030 
0x03f8e46c  coredll.dll + 0x0004446c 
0x801087c4    ???  
0x801367b4    ???  
0x8010ce78    ???  
0x801086dc    ???  
0x03f8e588  coredll.dll + 0x00044588 
0x785a56a4  mylib.dll + 0x000056a4 
0x785bdd60  mylib.dll + 0x0001dd60 
0x785bbd0c  mylib.dll + 0x0001bd0c 
0x785bdb38  mylib.dll + 0x0001db38 
0x3001db20   my.exe + 0x0001db20 
0x3001dc40   my.exe + 0x0001dc40 
0x3001a8a4   my.exe + 0x0001a8a4 
0x3001a79c   my.exe + 0x0001a79c 
0x03f67348  coredll.dll + 0x0001d348 

누락 된 스택 주소는 어디에서 찾을 수 있습니까? 어떤 제안?

감사합니다, PaulH

편집은 : 비누 상자의 제안 @ 복용, 나는 "있는 My.exe"

+1

예상되는 모듈을 모두 반환하는 함수입니까? 아마도 중요한 것 (예 : 메인 프로그램이나 kernel32 등)이 누락되었습니다 ... 대신 주소 비교가 <=/> =이 아니어야합니까? – SoapBox

+0

@SoapBox - 흥미 롭습니다. 아니, 그렇지 않아. 1 개 항목이 누락되었습니다. 내 응용 프로그램은 .exe에 의해로드되는 DLL입니다. 해당 .exe가 목록에서 누락되었습니다. – PaulH

+0

주소에서 1 개 이상의 라이브러리가 누락되어있는 것으로 보입니다. 아마도 귀하의 답변이 아니 겠지만, 누락 된 부분이있을 수 있습니다. – SoapBox

답변

0

CPU는 스택의 코드 단지 주소 이상을 포함하여 격차의 일부에 작성했습니다. 함수 인수는 스택에서도 전달됩니다. 디버거 만이 스택 프레임에 무엇이 있는지 정확히 알 수 있습니다. 디버거는 .pdb 파일에서 디버거를 가져옵니다. 그게 정말 도움이되지 않을거야, 프로그램 자체를 디버깅 할 수 없습니다. 일반 Windows에서는 미니 덤프를 사용하여 사후 분석을 수행하며 모바일에서 사용 가능한지 여부는 알 수 없습니다. 그것은해야한다.

+0

0x80000000 주소가 코드를 참조하지 않는다는 말입니까? 어떤 종류의 것들을 참조 할 수 있습니까? – PaulH

+0

@ PaulH : Data, 내가 설명했다. 인수를 떠올리게 할 수 있습니다. –

관련 문제