2010-06-28 2 views
2

제 3 자 DLL이 언로드 된 후 재귀 스택 오버플로 충돌을 일으키는 것처럼 보이는 나약한 문제가 있습니다. 내가 (windbg를 사용) 스택에이 패턴으로 바람 : 당신이 생각 하듯이, 나는 ThirdParty.dll에 대한 소스 코드가없는Windows 스택 추적에서 "언로드 된"접두사는 무엇을 의미합니까?

<Unloaded_ThirdParty.dll>+0xdd01 
ntdll!ExecuteHandler2+0x26 
ntdll!ExecuteHandler+0x24 
ntdll!KiUserExceptionDispatcher+0xf 
<Unloaded_ThirdParty.dll>+0xdd01 
ntdll!ExecuteHandler2+0x26 
ntdll!ExecuteHandler+0x24 
ntdll!KiUserExceptionDispatcher+0xf 
... 

.

Q : 접두사 "Unloaded_"는 스택 덤프에서 무엇을 의미합니까? 나는 전에이 문제를 다뤄 본 적이 없다.

답변

8

즉, ThirdParty.dll은 더 이상 참조되지 않고 충돌이 발생할 때 메모리에서 이미 제거되었습니다. 실제 스택 트레이스를 확인하려면 다음 명령을 사용하여 메모리에 원래의 장소에 .DLL를 다시로드해야합니다 물론

.reload /f ThirdParty.dll=0xaaaaaaaa 

당신은 모듈의 원래 기본 주소로 0xaaaaaaaa를 교체해야합니다. 모듈이 이미 언로드되었는지 여부를 파악하기는 다소 어려울 수 있지만, HMODULE이 dll을 참조하는 경우, HMODULE의 값이 기본 주소입니다. 최악의 경우, 언로드하기 바로 전에 dll의 HMODULE을 기록하는 코드에 디버거 추적 문을 추가 할 수 있습니다.

1

나는 전에와 마찬가지로 충돌이 있었고 JS는 충돌 이전에 dll이 언로드되었음을 나타냅니다. 그러나 해당 dll에 스택 추적을하면 문제를 진단하는 데 필요한 정보가 제공되지 않을 수도 있습니다.

코드가 끝났다고 생각하여 라이브러리의 언로드 중에 라이브러리의 포인터가 있거나 어딘가에있는 포인터가 여전히 있습니다. 내 생각 엔 아마도 다른 스레드의 콜백 일 것이다. FreeLibrary()에 대한 호출을 소스에서 검색하고 FreeLibrary 심볼에 중단 점을 넣는 것이 좋습니다. 라이브러리가 언로드되는 위치를 확인한 다음 dll을 참조하는 모든 데이터가 재설정되었는지 확인하십시오. 스레드가 여러 개인 경우 뮤텍스를 사용하십시오.

이 도구는 매우 유용 할 수 있습니다. Process Monitor 나는 dll로드 및 언로드 이벤트를 보여주고 각각에 대해 스택 추적을 제공한다고 생각합니다.

관련 문제