Debugging in Classic Asp

Classic Asp is kind of old fashioned or even a historical language for some folks but if you are a part of a team which is responsible for maintenance of a huge application, you have to live with Classic Asp and its limitations. Because Asp is a server side language so we have to enable Server side debugging from IIS.

There are different techniques used for debugging classic Asp code. Let’s take a look of them.

Writing Debug Messages

It is the most basic, easy but childish way of debugging classic Asp. You use Response object and print values of your desired variables all over the page.

Creating Macro

It won’t allow you to step into DLL files for obvious reasons, but I am sure it’s more efficient than writing debug messages to diagnose the issues.
Here is a small process of using this technique.

First of all, check if you have enabled server side debugging from IIS. If you haven’t then just do it by having a look as above screen shot displays.
Create a macro by choosing View->Other Windows->Macro Explorer.
Record a new Macro and paste the hooking code in the body of this macro.
Save the macro.
Hookup the debugger with IIS by opening a Browser and open any .asp page. This will load the iisprocess in the memory.
Run your macro, it will automatically hook with this process in memory.
Now open the asp page you want to debug.
Set a Break Point in the code (in active tags ofcourse
Browse to your page and it will automatically break at the break-point!

hooking code goes here

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
Sub ClassicASPAttach()
 
Try
 
Dim os As System.Version = System.Environment.OSVersion.Version
 
Dim IISProcess As String = "w3wp.exe"
 
If os.Major = 5 And os.Minor < 2 Then
 
IISProcess = "dllhost.exe"
 
End If
 
Dim processFound As Boolean = False
 
Dim process As EnvDTE80.Process2
 
For Each process In DTE.Debugger.LocalProcesses
 
'Determine if the process could the IIS worker process
 
Dim processName As String = process.Name.ToLowerInvariant()
 
Dim processBaseName As String = System.IO.Path.GetFileName(processName)
 
If Not processBaseName = IISProcess Then
 
If Not processBaseName = "inetinfo.exe" Then
 
Continue For
 
End If
 
End If
 
'Determine if the process contains asp.dll
 
Dim aspLoaded As Boolean = False
 
Dim diagProcess As System.Diagnostics.Process = System.Diagnostics.Process.GetProcessById(process.ProcessID)
 
Dim diagModule As System.Diagnostics.ProcessModule
 
For Each diagModule In diagProcess.Modules
 
Dim moduleName As String = System.IO.Path.GetFileName(diagModule.FileName).ToLowerInvariant()
 
If moduleName = "asp.dll" Then
 
aspLoaded = True
 
Exit For
 
End If
 
Next
 
'If the process contains asp.dll, attach to it
 
If aspLoaded Then
 
process.Attach2("Script")
 
processFound = True
 
End If
 
Next
 
If Not processFound Then
 
MsgBox("Could not find this IIS process. Hit a web page containing classic ASP script so that the process will start.")
 
End If
 
Catch ex As System.Exception
 
MsgBox(ex.Message)
 
End Try
 
End Sub

Cheers and Happy Coding :)

Leave a Reply

Your email address will not be published. Required fields are marked *