ISAPI 필터를 만들었습니다. develpoment 서버 및 SIT 서버에서 제대로 작동합니다.ISAPI 필터가 충돌 함 IIS
그러나 프로덕션 서버에서는 작동하지 않습니다. 이벤트 뷰어에서
다음 로그 : 모듈 msvcr80.dll, 버전 8.0.50727.3053, 오류 주소 0x00046039을 오류있는, 오류있는 응용 프로그램 W3wp.exe를, 버전 6.0.3790.2825 :보고 오류를 대기
.
ISAPI 필터를 만들었습니다. develpoment 서버 및 SIT 서버에서 제대로 작동합니다.ISAPI 필터가 충돌 함 IIS
그러나 프로덕션 서버에서는 작동하지 않습니다. 이벤트 뷰어에서
다음 로그 : 모듈 msvcr80.dll, 버전 8.0.50727.3053, 오류 주소 0x00046039을 오류있는, 오류있는 응용 프로그램 W3wp.exe를, 버전 6.0.3790.2825 :보고 오류를 대기
.
글쎄, 실제로 무슨 일이 일어나고 있는지 알려주는 정보가 충분하지 않습니다. 당신이 정말로 이해해야하는 것은 문제를 일으키는 조건입니다. 좋은 오래된 Debugging Tools for Windows은 여기에 친구입니다. 디버거를 사용하는 데 별 어려움이 없다면 ADPlus과 Debug Diag과 같은 도구가 유용 할 것입니다. 또한 IIS 내에서 디버깅 조언을 찾고 있다면 훌륭한 자료 인 Tess Ferrandez's Blog을 확인해 보는 것이 좋습니다.
C- 런타임 기능 중 하나에 잘못된 포인터가 전달되고있을 가능성이 있습니다. 디버거를 사용하면 해당 함수가 무엇인지 전달되는 인수가 무엇인지 식별 할 수 있어야합니다. 그 정보로 잘 무장하면 당신은 무슨 일이 일어나고 있는지 알아낼 수있을 것입니다.
프로세스에 연결하여 Visual Studio를 사용하여 디버깅 할 수 있어야합니다. Process Explorer을 사용하면 d3을 실행중인 w3wp.exe 프로세스와 다른 컴퓨터에서 코드를 디버깅 할 수있는 원격 디버깅 도구를 파악할 수 있습니다.
이 문제가 발생하면 CodeProject에서 Jochen Klambach's StackWalker을 얻었습니다. 업데이트 :StackWalker has now graduated to Codeplex. 확실히 codeplex 릴리스를 얻으십시오. 몇 가지 업데이트 및 수정 사항이 포함되어 있습니다.
필터가 충돌 할 때 코드 용 스택을 인쇄합니다.
나는 그것이 한 방법이 : 내 필터가 모든 작업을 수행하는 경우, I는 제외하고 ... 시도와 논리를 포위 내 필터에 OnAuthComplete 내 : 다음
__try
{
dwRetval = DoRewrites(...);
}
__except (ExcFilter(GetExceptionInformation()))
{
}
그리고, ExcFilter 이런 식으로 정의된다 :
extern "C" int ExcFilter(EXCEPTION_POINTERS *pExp)
{
MyLoggingStackWalker *sw = new MyLoggingStackWalker();
sw->ShowCallstack(GetCurrentThread(), pExp->ContextRecord);
return EXCEPTION_CONTINUE_SEARCH; // allow the process to crash
}
LoggingStackWalker는 StackWalker에서 파생를하고, 로그 파일에 그 출력을 보낼 수있는 OnOutput 방법을 재정의합니다. 또한 DLL이있는 디렉토리를 포함하도록 PDB 파일의 검색 경로를 설정합니다.
class MyLoggingStackWalker : public StackWalker
{
public:
MyLoggingStackWalker() : StackWalker()
{
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
// add the directory for the ISAPI DLL, to the search path for PDB files
this->m_szSymPath = (LPSTR) malloc(_MAX_PATH);
_splitpath_s(DllLocation, drive, _MAX_DRIVE, dir, _MAX_DIR, NULL, 0, NULL, 0);
_makepath_s(this->m_szSymPath, _MAX_PATH, drive, dir, NULL, NULL);
}
virtual void OnOutput(LPCSTR szText)
{
LogMessage((char*)szText);
StackWalker::OnOutput(szText);
}
};
이를 증명하기 위해 코드에서 vscprintf에 잘못된 포인터를 전달합니다. IIS7에서 스택 추적 결과를 얻습니다. 첫 번째 몇 개의 프레임이 라인 번호와 함께 C 런타임에 있음을 볼 수 있습니다. StackWalker는 기본 설정을 사용하는 경우 MS 심볼 서버에서 심볼 파일을 실제로 다운로드하지만, 원하는 경우이 설정을 해제 할 수 있습니다. 그런 다음 프레임의 다음 무리는 내 코드에서 가져온 것입니다. 문제의 위치를 찾아냅니다. 다음의 스택 프레임 - 모든 IIS 모듈입니다. Vista의 IIS7입니다. 심볼 서버에는 이러한 모듈에 대한 심볼이 없었던 것 같습니다. 어쨌든 stacktrace가 문제가 어디 있는지에 대해서는 의심의 여지가 없습니다.
f:\dd\vctools\crt_bld\self_x86\crt\src\output.c (1068): _output_l
f:\dd\vctools\crt_bld\self_x86\crt\src\vsprintf.c (405): _vscprintf_helper
f:\dd\vctools\crt_bld\self_x86\crt\src\vsprintf.c (414): _vscprintf
c:\dev\isapi\filter\logger.c (193): LogMessage
c:\dev\isapi\filter\rewriter.c (2036): EvaluateRewrites
c:\dev\isapi\filter\rewriter.c (789): DoRewrites
c:\dev\isapi\filter\rewriter.c (955): OnAuthComplete
c:\dev\isapi\filter\rewriter.c (1139): HttpFilterProc
60531896 module(filter): (filename not available): (function-name not available)
60531FAB module(filter): (filename not available): (function-name not available)
605314E3 module(filter): (filename not available): (function-name not available)
60531276 module(filter): (filename not available): (function-name not available)
6D122EA0 module(iiscore): (filename not available): (function-name not available)
6D123696 module(iiscore): (filename not available): (function-name not available)
6D12AA4C module(iiscore): (filename not available): (function-name not available)
6D125D3B module(iiscore): (filename not available): (function-name not available)
6D1220F4 module(iiscore): (filename not available): (function-name not available)
6D124EEF module(iiscore): (filename not available): (function-name not available)
6D12C6B8 module(iiscore): (filename not available): (function-name not available)
70CB13B3 module(w3dt): (filename not available): UlAtqGetContextProperty
70CB11DA module(w3dt): (filename not available): (function-name not available)
71A42611 module(W3TP): (filename not available): THREAD_POOL::PostCompletion
71A42812 module(W3TP): (filename not available): OverrideThreadPoolConfigWithRegistry
71A41E85 module(W3TP): (filename not available): (function-name not available)
76A54911 module(kernel32): (filename not available): BaseThreadInitThunk
7727E4B6 module(ntdll): (filename not available): __RtlUserThreadStart
7727E489 module(ntdll): (filename not available): _RtlUserThreadStart
7727E489 module(ntdll): (filename not available): _RtlUserThreadStart
개발 환경 (winxp) 및 SIT 환경 (Windows Server 2003)에서는 동일한 dll (ISAPI 필터)이 제대로 작동하지만 프로덕션 환경 (Windows Server 2003)에서는 정상적으로 작동하지 않습니다. 또한 프로덕션 서버에 아무것도 설치할 수 없습니다. 이 문제를 해결하는 다른 방법이 있습니까 –
개발 환경에서 Application Verifier를 사용하여 제어 된 조건에서 응용 프로그램이 작동하지 않을지 확인할 수 있습니다 (페이지 힙 사용을 시도하십시오). 프로덕션 시스템의 소유자가 디버깅 도구를 사용할 수 있도록하는 데 실패 할 수 있습니다. 패키지를 설치할 필요가 없습니다. 파일 복사가 수행되며 이후에 삭제할 수 있습니다. 이 주장은 저에게 효과적입니다. –
Tess rocks! ... 또한 David Wang의 오래된 기사도 보석입니다. 슬프게도 그는 더 이상 블로그를 쓰지 않습니다. – Kev