При столкновении с этой проблемой я захватил Jochen Klambach's StackWalker из CodeProject. Обновление:StackWalker has now graduated to Codeplex. Определенно получить выпуск кода; он содержит несколько обновлений и исправлений.
Он выведет стек для вашего кода при сбое фильтра.
То, как я сделал это было так: в 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, чтобы отправить этот вывод в лог-файл. Он также устанавливает путь поиска для файлов PDB для включения каталога, в котором находится DLL.
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. Это IIS7 на Vista; Я думаю, что сервер символов не имел символов для этих модулей. В любом случае, поскольку вы можете видеть, что 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
Тот же самый DLL-фильтр (ISAPI-фильтр) отлично работает в среде разработки (winxp) и среде SIT (Windows Server 2003), но не в производственной среде (Windows Server 2003). Кроме того, мы не сможем установить что-либо на рабочем сервере) Есть ли другой способ решить эту проблему? – 2009-10-06 12:29:59
Вы можете попробовать использовать Application Verifier в своей среде разработки, чтобы убедиться, что это спровоцирует ваше приложение на сбой в контролируемых условиях (попробуйте включить кучу страницы). В противном случае вы сможете преследовать владельца производственной системы, чтобы вы могли включить инструменты для отладки. Вам не нужно устанавливать пакет, чтобы получить их там. Будет сделана копия файла, и вы сможете удалить ее позже. Этот аргумент сработал для меня. –
Тесс камни! ... также старые статьи Дэвида Ванга также являются драгоценными камнями. К сожалению, он больше не блогов :( – Kev