6.2. Debug Monitor

Debug Monitor is a powerful graphical- and console-mode tool for monitoring all activities handled by the WinDriver kernel.
You can use this tool to monitor how each command sent to the kernel is executed.

In addition, WinDriver enables you to print your own debug messages to the Debug Monitor, using the WD_DebugAdd() function (described in the WinDriver PCI Low-Level API Reference) or the high-level PrintDbgMessage() function [B.10.15].

The Debug Monitor comes in two versions:

Both Debug Monitor versions are provided in the WinDriver/util directory

6.2.1. The wddebug_gui Utility

wddebug_gui is a fully graphical (GUI) version of the Debug Monitor utility for Windows and Linux.

  1. Run the Debug Monitor using either of the following methods:
    • Run WinDriver/util/wddebug_gui
    • Run the Debug Monitor from DriverWizard's Tools menu.
    • On Windows, run Start | Programs | WinDriver | Debug Monitor.

    Figure 6.1. Start Debug Monitor

    Start Debug Monitor

  2. Set the Debug Monitor's status, trace level and debug sections information from the Debug Options dialogue, which is activated either from the Debug Monitor's View | Debug Options menu or the Debug Options toolbar button.

    Figure 6.2. Debug Options

    Debug Options

    • Status — Set trace on or off.
    • Section — Choose what part of the WinDriver API you would like to monitor.

      For example, if you are experiencing problems with the interrupt handler on your PCI card, select the PCI and Interrupts sections.

      Choose carefully those sections that you would like to monitor. Checking more options than necessary could result in an overflow of information, making it harder for you to locate your problem.
    • Level — Choose the level of messages you want to see for the resources defined.
      • Error is the lowest trace level, resulting in minimum output to the screen.
      • Trace is the highest trace level, displaying every operation the WinDriver kernel performs.
    • Send debug messages to the operating system kernel debugger

      Select this option to send the debug messages received from the WinDriver kernel module to an external kernel debugger, in addition to the Debug Monitor.

      On Windows 7 and higher, the first time that you enable this option you will need to restart the PC.
      A free Windows kernel debugger, WinDbg, is distributed with the Windows Driver Kit (WDK) and is part of the Debugging Tools for Windows package, distributed via the Microsoft web site.
    • Driver Name

      This field displays the name of the driver currently being debugged. Changing it allows you to debug a renamed WinDriver driver.

  3. Once you have defined what you want to trace and on what level, click OK to close the Debug Options window.
  4. Optionally make additional configurations via the Debug Monitor menus and toolbar.
    When debugging OS crashes or hangs, it's useful to auto-save the Debug Monitor log, via the File –> Toggle Auto-Save menu option (available also via a toolbar icon), in addition to sending the debug messages to the OS kernel debugger (see Step 2).
  5. Run your application (step-by-step or in one run).
    You can use the Edit –> Add Custom Message... menu option (available also via a toolbar icon) to add custom messages to the log. This is especially useful for clearly marking different execution sections in the log.
  6. Watch the Debug Monitor log (or the kernel debugger log, if enabled) for errors or any unexpected messages. Search in wddebug_gui

wddebug_gui allows to find expressions in the Debug output in 4 ways:

  1. Starting to type an expression with the keyboard immediately searches for it in the Debug output.
  2. Pressing CTRL+F displays the Find field in the toolbar
  3. Clicking the Find icon in the toolbar.
  4. Going to Edit->Find...

If an expression is found it is marked. It is possible to browse between occurences of an expression using Prev (F2) and Next (F3).

Figure 6.3. Search in wddebug_gui

Search in wddebug_gui Opening Windows kernel crash dump with wddebug_gui

In driver development, it is not uncommon to experience kernel crashes that lead to the Blue Screen of Death (BSOD). In order to assist developers in debugging and solving these crashes, WinDriver allows saving its kernel debug messages in the memory dump that Windows automatically creates when the system crashes. These crash dumps can later be opened in wddebug_gui after the system was restarted.

  1. Make sure Send debug messages to the operating system kernel debugger is checked in the Options window before reproducing the crash.
  2. Load up the WinDriver symbols by going to File->Symbol File Path... and loading your driver's symbols MyDriver.pdb(the file name for the default driver is lib/windrvr1411.pdb). Do not skip this step, otherwise the kernel dump might not be comprehensible.
  3. Load the kernel crash dump (.dmp) file by going to File->Process Kernel Dump.... wddebug_gui will display the output from the crash dump. Running wddebug_gui for a Renamed Driver

By default, wddebug_gui logs messages from the default WinDriver kernel module — windrvr1411.sys/.dll/.o/.ko. However, you can also use wddebug_gui to log debug messages from a renamed version of this driver [15.2], in two ways:

  1. From within wddebug_gui, By going to View->Debug Options and changing the value of the "Driver name" field to your own renamed driver's name.
  2. By running wddebug_gui from the command line with the driver_name argument: wddebug_gui <driver_name>.

The driver name should be set to the name of the driver file without the file's extension; e.g., windrvr1411, not windrvr1411.sys (on Windows) or windrvr1411.o (on Linux).

For example, if you have renamed the default windrvr1411.sys driver on Windows to my_driver.sys, you can log messages from your driver by running the Debug Monitor using the following command: wddebug_gui my_driver

6.2.2. The wddebug Utility Console-Mode wddebug Execution

The wddebug version of the Debug Monitor utility can be executed as a console-mode application on all supported operating systems: Windows, and Linux. To use the console-mode Debug Monitor version, run WinDriver/util/wddebug in the manner explained below.

wddebug console-mode usage

wddebug [<driver_name>] [<command>] [<level>] [<sections>]

The wddebug arguments must be provided in the order in which they appear in the usage statement above.

  • <driver_name> — The name of the driver to which to apply the command.

    The driver name should be set to the name of the WinDriver kernel module — windrvr1411 (default), or a renamed version of this driver (refer to the explanation in Section 15.2).

    The driver name should be set to the name of the driver file without the file's extension; e.g., windrvr1411, not windrvr1411.sys (on Windows) or windrvr1411.o (on Linux).
  • <command> — The Debug Monitor command to execute:
    • Activation commands:
      • on — Turn the Debug Monitor on.
      • off — Turn the Debug Monitor off.
      • dbg_on — Redirect the debug messages from the Debug Monitor to a kernel debugger and turn the Debug Monitor on (if it was not already turned on).
        On Windows 7 and higher, the first time that you enable this option you will need to restart the PC.
      • dbg_off — Stop redirecting debug messages from the Debug Monitor to a kernel debugger.
      The on and dbg_on commands can be used together with the <level> and <sections> arguments.
    • dump — Continuously send ("dump") debug information to the command prompt, until the user selects to stop (by following the instructions displayed in the command prompt).
    • status — Display information regarding the running driver (<driver_name>), the current Debug Monitor status — including the active debug level and sections (when the Debug Monitor is on) — and the size of the debug-messages buffer.
    • clock_on — Add a timestamp to each debug message. The timestamps are relative to the driver-load time, or to the time of the last clock_reset command.
    • clock_off — Do not add timestamps to the debug messages.
    • clock_reset — Reset the debug-messages timestamps clock.
    • sect_info_on — Add section(s) information to each debug message.
    • sect_info_off — Do not add section(s) information to the debug messages.
    • help — Display usage instructions.
    • No arguments (including no commands) — This is equivalent to running 'wddebug help'.

The following arguments are applicable only with the on or dbg_on commands:

  • <level> — The debug trace level to set — one of the following flags: ERROR, WARN, INFO, or TRACE (default).
    ERROR is the lowest trace level and TRACE is the highest level (displays all messages).
    When the <sections> argument is set, the <level> argument must be set as well (no default).
  • <sections> — The debug sections — i.e., the WinDriver API sections — to monitor.
    This argument can be set either to ALL (default) — to monitor all the supported debug sections — or to a quoted string that contains a combination of any of the supported debug-section flags (run 'wddebug help' to see the full list).

Usage Sequence

To log messages using wddebug, use the following sequence:

  • Turn on the Debug Monitor by running wddebug with either the on or dbg_on command; the latter redirects the debug messages to the OS kernel debugger before turning on the Debug Monitor.

    You can use the <level> and <sections> arguments to set the debug level and sections for the log. If these arguments are not explicitly set, the default values will be used; (note that if you set the sections you must also set the level).

    You can also log messages from a renamed WinDriver driver by preceding the command with the name of the driver (default: windrvr1411) — see the <driver_name> argument.

  • If you did not select to redirect the debug messages to the OS kernel debugger (using the dbg_on command), run wddebug with the dump command to begin dumping debug messages to the command prompt.
    You can turn off the display of the debug messages, at any time, by following the instructions displayed in the command prompt.
  • Run applications that use the driver, and view the debug messages as they are being logged to the command prompt/the kernel debugger.
  • At any time while the Debug Monitor is running, you can run wddebug with the following commands:
  • When you are ready, turn off the Debug Monitor by running wddebug with the off command.
    The status command can be used to view information regarding the running WinDriver driver even when the Debug Monitor is off.

The following is an example of a typical wddebug usage sequence. Since no <driver_name> is set, the commands are applied to the default driver — windrvr1411.

  • Turn the Debug Monitor on with the highest trace level for all sections:
    wddebug on TRACE ALL

    This is the same as running 'wddebug on TRACE', because ALL is the default <sections> value.
  • Dump the debug messages continuously to the command prompt or a file, until the user selects to stop:
    wddebug dump
    wddebug dump <filename>
  • Use the driver and view the debug messages in the command prompt.
  • Turn the Debug Monitor off:
    wddebug off Debugging in Windows 10 IoT Core

In order to debug your WinDriver application and driver under Windows 10 IoT Core:
  1. Copy WinDriver\samples\wddebug\wddebug.exe to your Windows 10 IoT Core device.
  2. Run wddebug dump from your target device (Preferrably using your SSH terminal).
  3. Run your application.
  4. Stop wddebug utility using CTRL+C.