|
ASP.NET Futures (July 2007): Debugging with Dynamic Languages for ASP.NET
Introduction
Visual Studio provides you with tools to help find errors in your ASP.NET Web pages.
In this walkthrough, you will use the debugger with dynamic languages. The debugger
enables you to step through the page's code line by line and examine the values
of variables.
In the walkthrough, you will create a Web page that uses dynamic language code to
create a simple calculator that squares a number. After creating the page (which
will include a deliberate error), you will use the debugger to examine the page
as it is running.
Tasks illustrated in this walkthrough include:
- Setting breakpoints and stepping through code.
- Invoking the debugger from a Web page in a file system Web site.
Prerequisites
In order to complete this walkthrough, you will need:
- Microsoft Visual Studio 2005 or Visual Web Developer Express Edition.
- The ASP.NET Futures release (May 2007 or later) installed on your computer. The .msi installer
file includes a Visual Studio Content Installer (.vsi) for creating a blank ASP.NET
Futures Web application in Visual Studio.
This walkthrough assumes that you have a general understanding of working in Visual
Web Developer or Visual Studio. For an introduction, see
Walkthrough: Creating a Basic Page in Visual Web Developer.
Creating the Web Site
In the first part of the walkthrough, you will create a page that you can debug.
If you have already created a Web site in Visual Studio (for example, by working
with
Walkthrough: Using Dynamic Languages with ASP.NET) you can use that Web site
and skip to "Creating a Page to Debug" later in this walkthrough. Otherwise, create
a new Web site and page by following these steps.
To create a file system Web site and an ASP.NET Web
page
- In Visual Studio, in the File menu, click
New Web Site. The New Web Site dialog box is displayed.
- In the Language list, click a dynamic language such as IronPython to make it the default language for the Web site.
Note You can use statically compiled languages in the same Web application
by creating pages and components in different programming languages.
- Under Visual Studio installed templates, click ASP.NET Web Site.
- In the Location box, select the File System
box, and then enter the name of the folder where you want to keep the pages of your
Web site. For example, type the folder name C:\DebugWebSite.
- Click OK. Visual Studio creates the folder and a new page
named Default.aspx.
Creating a Page to Debug
For this walkthrough, it is important that you create a new page as specified in
the following procedure.
To add a page to the Web site
- Close the Default.aspx page.
- In Solution Explorer, right-click the name of your Web site and then click Add New Item.
- Under Visual Studio installed templates, select Web Form.
- In the Name box, enter DebugPage.aspx.
The language defaults to your selected dynamic language.
- Make sure that the Place code in separate file check box
is checked.
In this walkthrough, you are creating a page with the code in a separate file. The
code for ASP.NET pages can be located either in the page or in a separate class
file.
Note In this release, there are small differences in the way breakpoints
and watches can be set, depending on whether the code is in the page or in a separate
file. The walkthrough calls out these differences.
- Click Add.
Adding Controls and Code for Debugging
You can now add some controls to the page and then add code. The code will be simple,
but enough to enable you to add breakpoints later.
To add controls and code for debugging
- Switch to Design view, and then from the Standard tab of
the toolbox, drag the following controls onto the page and set their properties
as indicated:
|
Control |
Properties |
|
Label |
ID: CaptionLabel
Text: (empty) |
|
TextBox |
ID: NumberTextBox
Text: (empty) |
|
Button |
ID: SquareButton
Text: Square |
|
Label |
ID: ResultLabel
Text: (empty) |
Note For this walkthrough, the layout of the page is not important.
- Right-click the page and click View Code.
In this release, event handlers must be coded and bound manually. You cannot create
them by double-clicking a control in Design view or by selecting an event in the
Properties window.
- Add an event handler for the button's Click event, with logic to call a function
named
Square to square the number entered by the user. The handler
might look like the following example.
Note The code example deliberately does not include error checking.
def SquareButton_Click(sender, e):
number = float(NumberTextBox.Text)
result = Square(number)
ResultLabel.Text = '%s squared is %8.2f' % \
(NumberTextBox.Text, result)
IronPython
- Switch to DebugPage.aspx and switch to Source view.
- Bind the event handler to the
SquareButton control by adding an
OnClick attribute, as shown in the following example.
<asp:Button ID="SquareButton" runat="server" Text="Square"
OnClick="SquareButton_Click" />
- Right-click the page and click View Code to return to the
code file
- Create the
Square function that squares the number. Include a bug in
the code, so that the function adds the number to itself instead of multiplying
it.
def Square(number):
return number + number
IronPython
- Add code to set the text of the
CaptionLabel control to
Enter a number: if this is the first time the page is running, and thereafter
to Enter another number:. The handler will look like
the following.
def Page_Load(sender, e):
postback = sender.IsPostBack
if IsPostBack:
CaptionLabel.Text = "Enter another number: "
else:
CaptionLabel.Text = "Enter a number: "
IronPython
You can use the IsPostBack property by itself, as shown in the if
statement, or qualified by sender, as shown in the assignment statement.
When it is used by itself, it is recognized as a property of the script page just
as it is in C# and Visual Basic. In the assignment statement, sender.IsPostBack
is used because later in the walkthrough it illustrates a limitation of debugging
in the current release.
Note In this case, sender and the implicit page reference
happen to be the same, because Page_Load handles a page event.
- Save the page.
- Press CTRL+F5 to run the page without debugging.
- Enter a number (other than 2) and press the Square button.
Notice that the result is incorrect, because there is an intentional bug in the program.
- Close the browser.
Debugging the Page
In this part of the walkthrough, you will use the debugger to examine the page code
line by line as it is running, add breakpoints to the code, and run the page in
debug mode. You will start by setting breakpoints.
To set breakpoints
- In Source view, set a breakpoint on the following line:
postback = sender.IsPostBack
IronPython
Note When your code is in a separate file, you can toggle breakpoints
by pressing F9, by right-clicking a line and choosing Breakpoint,
or by clicking in the margin to left of the line. In this release, the only mechanism
that works for code embedded in a Web page is clicking in the margin.
- Set another breakpoint on the following line of the
SquareButton_Click
handler:
IronPython
You are now ready to run the debugger.
To run the debugger
- In the Debug menu, click Start Debugging
(or press F5) to run the page in debug mode.
Note The first time you debug, you will be prompted to modify
the Web.config file to enable debugging. Debugging is disabled by default, for better
performance.
Because the breakpoint is in the Page_Load event handler, the page has not
finished processing yet. The browser is open, but the page is not yet displayed.
- Click the
postback variable and press SHIFT+F9 to display its value
in a Quick Watch window. The value is null.
Note In this release, the Locals window,
the Watch and QuickWatch windows,
and the Immediate window are limited to local variables
in IronPython, and do not yet work in Managed JScript.
- Press F10 to execute the assignment statement, and check the value of
postback
(IronPython only) to see that it is now false.
- In the Debug menu, click Windows
and then click Locals.
This opens the Locals window, which displays the values
of variables and objects that are in scope at the current line being executed (IronPython
only). The value of postback is false.
Notice that sender, IsPostBack, CaptionLabel,
and SquareButton do not appear in the Locals
window.
- In the Immediate window, use the question mark operator
to examine the value of
postback (IronPython only).
The Immediate window display will look like the following:
>? postback
>false
- In the Debug menu, click Windows,
click Watch, and then click Watch 1
(IronPython only).
Note: If you are using Visual Studio Express Edition, the debugger
offers only a single Watch window.
- Right-click
postback, then click Add Watch
to add the postback variable to the watch.
Note In the current release, you cannot right-click to add a watch
if the code is in the page instead of in a separate file. Instead, you can enter
the name of the variable in the first cell of the Name column
in the Watch window.
- Press F10 several times to step through the if statement.
When the last line of the if statement has executed, the execution pointer
pauses on the next function. The body of the Page_Load
method is still in scope, as you can see from examining the Locals window.
- Press F5 to continue execution and display the page.
- Enter the value 7 into the text box and click the
Square button.
The debugger is displayed again, with the breakpoint in the
Page_Load event handler. Press F10 to execute the line. The
Watch window shows that the value of postback is true.
- Press F5 to continue.
The debugger processes the Page_Load event handler and enters the SquareButton_Click
handler, where it stops on the second breakpoint you set.
- Press F11 to step into the
Square function.
- Continue stepping through the function until you return from it.
Notice that the value of result still is not set (IronPython only).
- Press F11 one more time, and note the incorrect value.
In the current release, you have to stop the debugger in order to correct the code.
- Press F5 to continue running the program.
See Also
Dynamic Languages for ASP.NET: Introduction
Walkthrough: Creating a Basic
Page in Visual Web Developer
|