This tutorial describes how to detect memory leaks in an IIS ISAPI DLL.
This tutorial covers the following:
Related tutorials:
Detecting memory leaks in a service.
Detecting memory leaks in an application that is a child process of a service.
Detecting memory leaks in ASP.Net with IIS.
Detecting memory leaks in ASP.Net with Web Development Server.
Detecting detect memory leaks for a child process.
This tutorial applies to all native ISAPI DLLs and to mixed-mode ISAPI DLLs that uses the native Win32 services API.
Memory Validator ships with an example ISAPI DLL in the examples\isapiExample folder in the Memory 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 Memory Validator.
The NT Service API is a simple API that allows you to load the Memory Validator profiling DLL and start the process of detecting memory leaks.
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 Memory Validator user interface).
The purpose of attachToMemoryValidator() is to use the NT Service API to instrument the ISAPI DLL with Memory Validator.
// code to load Memory Validator into the IIS process for this ISAPI
// this assumes the ISAPI is in C:\testISAPIWebsite\
#include "..\..\svlMVStubService\svlMVStubService.h"
#include "..\..\..\svlCommon\svlServiceError.h"
static void attachToMemoryValidator()
{
svlMVStub_setLogFileName(L"C:\\testISAPIWebsite\\svl_MV_log.txt");
svlMVStub_deleteLogFile();
SVL_SERVICE_ERROR errCode;
#ifdef IS6432
// x86 with x64 GUI
errCode = svlMVStub_LoadMemoryValidator6432();
#else //#ifdef IS6432
// x86 with x86 GUI
// x64 with x64 GUI
errCode = svlMVStub_LoadMemoryValidator();
#endif //#ifdef IS6432
if (errCode != SVL_OK)
{
DWORD lastError;
lastError = GetLastError();
svlMVStub_writeToLogFileW(L"Memory Validator load failed. \r\n");
svlMVStub_writeToLogFileLastError(lastError);
svlMVStub_writeToLogFile(errCode);
svlMVStub_dumpPathToLogFile();
}
else
{
svlMVStub_writeToLogFileW(L"Memory Validator load success. \r\n");
errCode = svlMVStub_StartMemoryValidatorForIIS();
if (errCode != SVL_OK)
{
DWORD lastError;
lastError = GetLastError();
svlMVStub_writeToLogFileW(L"Starting Memory Validator failed. \r\n");
svlMVStub_writeToLogFileLastError(lastError);
svlMVStub_writeToLogFile(errCode);
}
svlMVStub_writeToLogFileW(L"Finished starting Memory 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 detecting memory leaks, 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
Memory Validator will monitor memory allocations and deallocations the service shutdown procedure and then present you with the memory leak report.
There are a few things to check.
svlMVStub_setLogFileName(SZLOGFILENAME);
You have learned how to add the NT Service API to an ISAPI DLL, how to use Memory Validator to monitor ISS and ISAPI, and what to look at to diagnose errors if things don’t work first time.