2011-03-01 5 views
5

프로세스의 각 스레드에 대한 모듈 이름을 얻으려고합니다. 프로세스 탐색기는 각 스레드와 관련된 모듈의 이름을 보여줍니다. 현재 프로세스에있는 모든 모듈과 모든 스레드를 문제없이 열거하고 관련 데이터를 얻을 수 있습니다. 현재 연결된 모듈을 추론하는 방법은 다음과 같습니다.스레드 정보에서 모듈 이름 얻기

if(module.BaseAddress < thread.StartAddress && (module.BaseAddress + module.BaseMemorySize) > thread.StartAddress) 
{ 
    // this is our module ;) 
} 

불행히도,이를 수행하는 구체적인 방법은 아닙니다. xfire_toucan.dll 모듈 procexp 미세에서 보여

모듈 목록에서
1972 : xfire_toucan.dll!ToucanSendGamestatsConsoleLine_V1+0x80 

그것이 우리 0x1026b000의 최대 메모리 ADDR주는 0x10000000의 기본 요지 및 0x26b000의 크기로 나타낸다. 그러나 관련된 스레드 시작 주소는 0x775e2ca0이며 모듈의 주 메모리 범위 밖에있는 프로세스에서 할당 된 메모리 블록의 일부입니다.

ProcExp와 같은 모듈을 얻는 방법에 대한 아이디어가 있습니까?

나는 C와 C#을 알고, 그래서 괜찮지 만, 내 프로젝트가 선호 그래서 C 번호 중 하나입니다]

답변

3

프로세스 탐색기는 각 스레드와 관련된 모듈을 표시되지 않습니다. Windows는이 정보를 유지 관리하지 않습니다. 스레드의 진입 점에 대한 심볼 이름을 보여줍니다. 이것은 대개 (항상 그런 것은 아님) 스레드를 시작한 모듈의 함수입니다. 프로그램에서 이러한 종류의 정보를 검색하려면 디버그 도움말 API를 사용할 수 있습니다. 아마 StackWalk64 함수를 사용하여 진입 점 이름을 검색 할 것입니다.

+0

스택을 안정적으로 유지하려면 어떻게해야합니까? 스레드의 기능에 대한 스택 오프셋이 설정되지 않았습니다. 스레드 함수 이전에 명확한 호출 집합이 없습니다. http://stackoverflow.pastebin.com/e1TLxwuj – Polynomial

+0

내가 말하는 것에 대해 더 잘 설명합니다. http://stackoverflow.pastebin.com/cFNjueAq – Polynomial

+0

실제로 입니다. 스택 워크를 수행하려면 모듈과 관련된 .pdb 파일이 필요합니다. 이 파일은 다른 것들 중에서 각 스택 프레임의 크기를 포함합니다. –