This wiki has been migrated to https://gitlab.com/wireshark/wireshark/-/wikis/home and is now deprecated. Please use that site instead.
Differences between revisions 27 and 28
Revision 27 as of 2008-11-24 22:40:38
Size: 6086
Editor: JaapKeuter
Comment: Add how to debug GLIb warnings.
Revision 28 as of 2009-08-17 09:04:16
Size: 6086
Comment: Group MSVC related debugging
Deletions are marked like this. Additions are marked like this.
Line 44: Line 44:
== Using GDB for debugging ==
Extracted from http://www.gnu.org/software/libtool/manual/libtool.html#Debugging-executables

If you want to debug your own build of Wireshark on UNIX before you install the application you have to run GDB through libtool, like so:

{{{
user@host:~/src/wireshark$ libtool --mode=execute gdb wireshark
}}}
== Using DDD for debugging ==
DDD is GNU's graphical front-end for the GDB command-line debugger (among others). http://www.gnu.org/software/ddd/

To help DDD locate your source files while debugging, "cd" into the directory where those source files exist and then start DDD through libtool (just like GDB), or look in the DDD menu "Edit" -> "GDB Settings..." -> "Search path for source files" and explicitly add the path there.

== Debugging GLib warnings ==
GLib calls by applications, like Wireshark, can cause warnings. To debug these you can set environment variables influencing how GLib reacts to these warnings. In combination with a debugger you can look at the call stack leading to this warning. See [[http://library.gnome.org/devel/glib/stable/glib-running.html|Running GLib Applications]]
Line 59: Line 75:

== Using GDB for debugging ==
Extracted from http://www.gnu.org/software/libtool/manual/libtool.html#Debugging-executables

If you want to debug your own build of Wireshark on UNIX before you install the application you have to run GDB through libtool, like so:

{{{
user@host:~/src/wireshark$ libtool --mode=execute gdb wireshark
}}}
== Using DDD for debugging ==
DDD is GNU's graphical front-end for the GDB command-line debugger (among others). http://www.gnu.org/software/ddd/

To help DDD locate your source files while debugging, "cd" into the directory where those source files exist and then start DDD through libtool (just like GDB), or look in the DDD menu "Edit" -> "GDB Settings..." -> "Search path for source files" and explicitly add the path there.

== Debugging GLib warnings ==
GLib calls by applications, like Wireshark, can cause warnings. To debug these you can set environment variables influencing how GLib reacts to these warnings. In combination with a debugger you can look at the call stack leading to this warning. See [[http://library.gnome.org/devel/glib/stable/glib-running.html|Running GLib Applications]]

Development Tips

Here you will find various tips useful while development and debugging.

Printing to a console

Sometimes you just want to peek at some variables to see whats going on in your code, without the need for a heavy duty debugger session. In these cases printf can be your best friend. To get this working (on Win32 at least) you need two things:

  • Open up the console
    • Start Wireshark and go to Edit|Preferences..., In the dialog box go to 'Open a console window' and select 'Always (debugging)', Click the Save button.
  • put printf statements in your code

proto_tree_add_debug_text(tree, format) will display debug message right in the place. Check proto.c for details.

If you have your eye on some condition, so you can add the following to your code:

if (condition) {
  g_print("Kilroy was here\n");
}

Notice that printf doesn't work for dumpcap (e.g. capture_loop.c) since stdio is used for communication with Wiresharks capture engine.

g_print is used instead, it works just the same.

Don't forget to remove these statements later, after you've found your bug. These printf like statements should not remain active in production code as they are often annoy the uninterested user.

Breakpoint on a specific packet number

Often you know, that you have a bug/problem in your dissector, which can be found only in a specific packet.

Let's say you know packet number 1234 has a bug, so you can add the following to your code:

if (pinfo->fd->num == 1234) {
  g_print("Here is my bug\n");
}

and simply set a breakpoint to the g_print call.

Of course you will need access to pinfo, but this should be the case in any dissector.

Don't forget to remove this later, after you've found your bug :)

Some debuggers, such as gdb and MSVC, also let you make breakpoints conditional; you could set a breakpoint at some point in a routine, and make the condition for the breakpoint be pinfo->fd->num == 1234.

Using GDB for debugging

Extracted from http://www.gnu.org/software/libtool/manual/libtool.html#Debugging-executables

If you want to debug your own build of Wireshark on UNIX before you install the application you have to run GDB through libtool, like so:

user@host:~/src/wireshark$ libtool --mode=execute gdb wireshark

Using DDD for debugging

DDD is GNU's graphical front-end for the GDB command-line debugger (among others). http://www.gnu.org/software/ddd/

To help DDD locate your source files while debugging, "cd" into the directory where those source files exist and then start DDD through libtool (just like GDB), or look in the DDD menu "Edit" -> "GDB Settings..." -> "Search path for source files" and explicitly add the path there.

Debugging GLib warnings

GLib calls by applications, like Wireshark, can cause warnings. To debug these you can set environment variables influencing how GLib reacts to these warnings. In combination with a debugger you can look at the call stack leading to this warning. See Running GLib Applications

Using MSVC++ for debugging

Extracted from http://www.ethereal.com/lists/ethereal-dev/200503/msg00778.html

If you are just wanting to debug Wireshark then the Win32 binaries should already include the debug symbols by default. You can look at the file config.nmake and ensure that the debug switch is enabled...

# Linker flags
# /DEBUG generate debug info
LOCAL_LDFLAGS=/DEBUG

Once you have a valid binary with debug symbols you can easily debug Wireshark by opening up the binary from within MSVC.

So from within Visual Studio 9 just click on the File ! Open ! Project/Solution menu and then browse to the installed location of the Wireshark binary. Typically: c:\program files\wireshark\wireshark-gtk2. Once you have it open you should see wireshark.exe listed in the far left window of Visual Studio. To execute Wireshark just press the F5 key. If you want to break within some location within Wireshark then just open a source file and set a break point. The execution of Wireshark.exe will halt at the specific location. You can then step through the source code to isolate/debug your issue.

Note: For Visual Studio 6, use File ! Open, change the file extension type to be all files, and then proceed as above.

Using the MSVC6 "source browser" capability

It is sometimes quite useful to be able to use the "Tools/Source Browser" capability of MSVC6 to find the definitions and references for Wireshark functions and variables.

To build and use the required "Browse Information File" (.bsc) file:

  1. Change config.nmake to add the /Fr switch to the compiler flags (in addition to making the linker flags /DEBUG change described above).

# Compiler flags
# /W3  warning level 3 (0 less - 4 most, 1 default)
# /Zi  create .pdb file for debugging
# /Fr  create .sbr files used by BSCMAKE to create a "Browse Information File"
LOCAL_CFLAGS=/Zi /W3 /Fr
  1. Build wireshark using nmake as usual
  2. Create the .bsc file as follows:

 user@host:~/src/wireshark$ nmake -f Makefile.nmake wireshark.bsc
  1. Open the Wireshark binary from within Visual Studio as described above; Select Tools/Source_Browser from the Toolbar; (If an error message appears, it may be necessary to specify the location of the .bsc file under Project/Settings). Enter a valid identifier and select OK to get a list of the source locations (file names and line numbers) of the definitions and references for the identifier.

By using the keyboard shortcuts associated with the source browser it is possible to quite easily navigate through source files. (See MSVC Help for "Browse Information Files").

For example: If the cursor is located at the beginning of an identifier, entering F12 will go immediately to the source file location of the definition of the identifier. Entering <Ctrl Num *> will then move the cursor back to the previous location.

Development/Tips (last edited 2019-02-01 14:23:13 by PeterWu)