views:

613

answers:

2

I'm trying to create a sidebar gadget without the use of Visual Studio. I've looked around for ways to debug them, but everything says that the Visual Studio JIT debugger is the only way to do it.

Has anyone been able to debug sidebar gadgets without Visual Studio?

+6  A: 

For years, I didn't use Visual Studio to work on Gadgets. There are a couple of ways you can debug gadgets without it, just not as extensively. For instance, you can't use the debugger; command without a proper debugger attached to the process. What you can do is use a program like DebugView to catch messages output by the System.Debug.outputString() method:

function test ()
{
    System.Debug.outputString("Hello, I'm a debug message");
}

This allows you to output variable dumps and other useful tidbits of information at certain stages of your code, so you can track it however you like.

As an alternative, you can roll your own debugging/script halting messages using window.prompt(). alert() was disabled for gadgets and confirm() is overridden to always return true, but they must have overlooked prompt().

function test ()
{
     // execute some code

     window.prompt(someVarToOutput, JSON.stringify(someObjectToExamine));

     // execute some more code
}

The JSON.stringify() method really helps out if you want to examine the state of an object during code execution.

Instead of window.prompt, you can also use the VBScript MsgBox() function:

window.execScript( //- Add MsgBox functionality for displaying error messages
      'Function vbsMsgBox (prompt, buttons, title)\r\n'
    + ' vbsMsgBox = MsgBox(prompt, buttons, title)\r\n'
    + 'End Function', "vbscript"
);

vbsMsgBox("Some output message", 16, "Your Gadget Name");

Finally, you can catch all errors with your script using the window.onerror event handler.

function window.onerror (msg, file, line)
{
    // Using MsgBox
    var ErrorMsg = 'An error has occurred'+(line&&file?' in '+file+' on line '+line:'')+'.  The message returned was:\r\n\r\n'+ msg + '\r\n\r\nIf the error persists, please report it.';
    vbsMsgBox(ErrorMsg, 16, "Your Gadget Name");

    // Using System.Debug.outputString
    System.Debug.outputString(line+": "+msg);

    // Using window.prompt
    window.prompt(file+": "+line, msg);        

    // Cancel the default action
    return true;
}

The window.onerror event even lets you output the line number and file (only accurate with IE8) in which the error occurred.

Good luck debugging, and remember not to leave in any window.prompts or MsgBoxes when you publish your gadget!

Andy E
Very useful. Thank you.Do I need a library to use the JSON object or is it part of the Windows gadget host environment?
bshacklett
@bshacklett: It's built into IE8, but your gadget needs to be in IE8 mode. You can also get a parser and stringifier from http://json.org/js.html
Andy E
Do they run in IE8 mode just by virtue of having IE8 installed on the system or is this something I have to specify?
bshacklett
You can specify IE8 mode using a meta tag. See http://blogs.msdn.com/ie/archive/2008/06/10/introducing-ie-emulateie7.aspx
Andy E
Great stuff. Many thanks.
Drew Noakes
+3  A: 
Drew Noakes