2009-10-06 4 views
1

ISAPI 필터를 만들었습니다. develpoment 서버 및 SIT 서버에서 제대로 작동합니다.ISAPI 필터가 충돌 함 IIS

그러나 프로덕션 서버에서는 작동하지 않습니다. 이벤트 뷰어에서

다음 로그 : 모듈 msvcr80.dll, 버전 8.0.50727.3053, 오류 주소 0x00046039을 오류있는, 오류있는 응용 프로그램 W3wp.exe를, 버전 6.0.3790.2825 :보고 오류를 대기

.

답변

1

글쎄, 실제로 무슨 일이 일어나고 있는지 알려주는 정보가 충분하지 않습니다. 당신이 정말로 이해해야하는 것은 문제를 일으키는 조건입니다. 좋은 오래된 Debugging Tools for Windows은 여기에 친구입니다. 디버거를 사용하는 데 별 어려움이 없다면 ADPlusDebug Diag과 같은 도구가 유용 할 것입니다. 또한 IIS 내에서 디버깅 조언을 찾고 있다면 훌륭한 자료 인 Tess Ferrandez's Blog을 확인해 보는 것이 좋습니다.

C- 런타임 기능 중 하나에 잘못된 포인터가 전달되고있을 가능성이 있습니다. 디버거를 사용하면 해당 함수가 무엇인지 전달되는 인수가 무엇인지 식별 ​​할 수 있어야합니다. 그 정보로 잘 무장하면 당신은 무슨 일이 일어나고 있는지 알아낼 수있을 것입니다.

+0

개발 환경 (winxp) 및 SIT 환경 (Windows Server 2003)에서는 동일한 dll (ISAPI 필터)이 제대로 작동하지만 프로덕션 환경 (Windows Server 2003)에서는 정상적으로 작동하지 않습니다. 또한 프로덕션 서버에 아무것도 설치할 수 없습니다. 이 문제를 해결하는 다른 방법이 있습니까 –

+0

개발 환경에서 Application Verifier를 사용하여 제어 된 조건에서 응용 프로그램이 작동하지 않을지 확인할 수 있습니다 (페이지 힙 사용을 시도하십시오). 프로덕션 시스템의 소유자가 디버깅 도구를 사용할 수 있도록하는 데 실패 할 수 있습니다. 패키지를 설치할 필요가 없습니다. 파일 복사가 수행되며 이후에 삭제할 수 있습니다. 이 주장은 저에게 효과적입니다. –

+0

Tess rocks! ... 또한 David Wang의 오래된 기사도 보석입니다. 슬프게도 그는 더 이상 블로그를 쓰지 않습니다. – Kev

0

프로세스에 연결하여 Visual Studio를 사용하여 디버깅 할 수 있어야합니다. Process Explorer을 사용하면 d3을 실행중인 w3wp.exe 프로세스와 다른 컴퓨터에서 코드를 디버깅 할 수있는 원격 디버깅 도구를 파악할 수 있습니다.

1

이 문제가 발생하면 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 
관련 문제