Writing a debugger in VB


Some might consider writing a managed debugger in VB.Net to be an oxymoron. But maybe not. Here’s a VB.Net snippet that serves as a highly-specialized debugger to launch an app and print all the modules that get loaded.


This is adapted from the C# sample snippet here that does the same thing. Although we know that VB.Net is theoretically powerful enough to do what C# does, I thought it would be nice to actually concretely see it in VB. 


Writing a whole debugger in VB?
We believe we could have written most of MDbg in VB (instead of C#).  However, just because it’s possible doesn’t mean that it’s easy to do. One concern is that although this is technically possible, I doubt MDbg’s usage conforms to the developer-paradigms / design rules that VB developers would expect. People don’t want to worry about things like programming with multiple threads, manipulating metadata, and apartments.
However, since MDbg takes care of most of these problems, building  on top of MDbg (like the sample below shows) should be easier.


Other trivia:
FWIW, It only took about 15 minutes for me to port it over, and I don’t actually know VB.Net. The IDE really helps you along, and I did a lot of it with Edit + Continue. The biggest problem I had was tracking down the “typeof” operator.  It also initially left off the MTAThread attribute and so it hung at the “proc.Go.WaitOne()” line, and then I remembered that ICorDebug is MTA, and so added the attribute.



‘—————————————————-
‘ Test harness to print all loaded modules
‘ Ported from C# version at:
http://blogs.msdn.com/jmstall/archive/2004/11/19/267135.aspx
‘—————————————————-
Imports System
Imports Microsoft.Samples.Debugging.MdbgEngine

Module Module1
<MTAThread()>
Sub Main()
‘ Get target filename from args
Dim filename As String
Dim args As String()
args = System.Environment.GetCommandLineArgs()
If (args.Length <> 2) Then
Console.WriteLine(“Usage: PrintMods <filename>”)
Console.WriteLine(
” Will run <filename> and print all loaded modules.”)
Return
End If
filename = args(1)

Dim debugger As MDbgEngine = New MDbgEngine()

‘ Set options. Specifically need to request Module Loads
debugger.Options.CreateProcessWithNewConsole = True
debugger.Options.StopOnModuleLoad = True

Dim proc As MDbgProcess = debugger.CreateProcess(filename, “”, DebugModeFlag.Default, Nothing)

‘ Consume all debug events, sniffing for LoadModules events.
While (proc.IsAlive)
proc.Go().WaitOne()
Dim o As Object = proc.StopReason

If (TypeOf o Is ModuleLoadedStopReason) Then
Dim m As ModuleLoadedStopReason = CType(o, ModuleLoadedStopReason)
Console.WriteLine(
“Module loaded:” & m.Module.CorModule.Name)
End If
End While

Console.WriteLine(“Done!”)
End Sub
End
Module


 


 

Comments (1)

  1. SteveJS says:

    John Robbins beat you to this by about 8 years. He did a sample Native debugger written in VB5 to show off multi-threading.

    Part I:

    http://www.microsoft.com/msj/0897/multithreading.aspx

    Part II:

    http://www.microsoft.com/msj/0997/multivb.aspx