This tutorial describes how to performance profile an IIS ISAPI DLL.
This tutorial covers the following:
Related tutorials:
Performance profiling a child process.
Performance profiling a service.
Performance profiling a child process of a service.
Performance profiling an IIS ISAPI DLL.
Performance profiling ASP.Net with IIS.
Performance profiling ASP.Net with Web Development Server.
This tutorial applies to all native ISAPI DLLs and to mixed-mode ISAPI DLLs that uses the native Win32 services API.
Performance Validator ships with an example ISAPI DLL in the examples\isapiExample folder in the Performance Validator installation directory.
The ISAPI DLL has already been modified to use the NT Service API. In this tutorial we’ll describe the modification you would make to the ISAPI DLL to make it work correctly with Performance Validator.
The NT Service API is a simple API that allows you to load the Performance Validator profiling DLL and start the process of performance profiling.
The API also includes some debugging functions to help provide debugging information via log files (the only way to get data out of an ISAPI DLL without a connection to the Performance Validator user interface).
The purpose of attachToPerformanceValidator() is to use the NT Service API to instrument the ISAPI DLL with Performance Validator.
// code to load Performance Validator into the IIS process for this ISAPI
// this assumes the ISAPI is in C:\testISAPIWebsite\
#include "..\..\svlPVStubService\svlPVStubService.h"
#include "..\..\..\svlCommon\svlServiceError.h"
static void attachToPerformanceValidator()
{
svlPVStub_setLogFileName(L"C:\\testISAPIWebsite\\svl_PV_log.txt");
svlPVStub_deleteLogFile();
SVL_SERVICE_ERROR errCode;
#ifdef IS6432
// x86 with x64 GUI
errCode = svlPVStub_LoadPerformanceValidator6432();
#else //#ifdef IS6432
// x86 with x86 GUI
// x64 with x64 GUI
errCode = svlPVStub_LoadPerformanceValidator();
#endif //#ifdef IS6432
if (errCode != SVL_OK)
{
DWORD lastError;
lastError = GetLastError();
svlPVStub_writeToLogFileW(L"Performance Validator load failed. \r\n");
svlPVStub_writeToLogFileLastError(lastError);
svlPVStub_writeToLogFile(errCode);
svlPVStub_dumpPathToLogFile();
}
else
{
svlPVStub_writeToLogFileW(L"Performance Validator load success. \r\n");
errCode = svlPVStub_StartPerformanceValidatorForIIS();
if (errCode != SVL_OK)
{
DWORD lastError;
lastError = GetLastError();
svlPVStub_writeToLogFileW(L"Starting Performance Validator failed. \r\n");
svlPVStub_writeToLogFileLastError(lastError);
svlPVStub_writeToLogFile(errCode);
}
svlPVStub_writeToLogFileW(L"Finished starting Performance Validator\r\n");
}
}
Now that the NT Service API has been implemented in your service, we can start collecting memory allocation data from the service.
If errors are found you will be presented with a dialog box specific to the error so that you can correct the error before starting the web browser.
To finish profiling the service, you need to stop IIS.
If you had selected Stop IIS when web browser is closed on the Monitor IIS and ISAPI dialog then you have nothing to do.
Otherwise, choose Launch > Services > Stop IIS
Performance Validator will profile the service shutdown procedure and then present you with the profiling results.
There are a few things to check.
svlPVStub_setLogFileName(SZLOGFILENAME);
You have learned how to add the NT Service API to an ISAPI DLL, how to use Performance Validator to monitor ISS and ISAPI, and what to look at to diagnose errors if things don’t work first time.