Xfce Wiki

Sub domains
 

This is an old revision of the document!


Panel Plugin Debugging

Debugging external panel plugins is possible by wrapping the executable against a shell script that runs a debug tool.

The exec command is available inside the desktop entry file that is shipped with every panel plugin. They are installed inside the directory “$prefix/share/xfce4/panel-plugins”. If the desktop entry file contains a key X-XFCE-Module instead of X-XFCE-Exec than it means it is an internal panel plugin. Internal panel plugins can be debugged by running the tools directly on xfce4-panel.

So, this lets you quite some possibilities to wrap an external panel plugin. You can create a new desktop entry file just for the purpose of running it with a debug tool, you can change the desktop entry file directly to point it to the shell script, or you can rename the panel plugin binary and write a shell script as the original file.

In the examples below we will use the first method that consists into creating a new desktop entry file. We will use as example a plugin called “clipman” that is installed inside the prefix “/usr/local”.

Debug with Valgrind (full example)

  • Make a copy of the desktop entry file
cp /usr/local/share/xfce4/panel-plugins/clipman.desktop \
/usr/local/share/xfce4/panel-plugins/clipman-valgrind.desktop
  • Edit the new file and change the Name= key to differentiate it from the original plugin, for instance append the name of the debug tool like “Clipman (valgrind)”
  • Change the Exec= key to point it to the shell script (remember the original path, you need it for the shell script)
  • Create an executable shell script containing:
#!/bin/sh
valgrind --log-file=$HOME/clipman-valgrind.log \
/usr/local/libexec/xfce4/panel-plugins/clipman "$@"
  • Now you can add the plugin “Clipman (valgrind)” to the panel as usual
  • You are able to use
    tail -f $HOME/clipman-valgrind.log

It'll be really slow as wrapped in valgrind, but you'll be able to hunt memory leaks.

More useful call to Valgrind

G_SLICE=always-malloc G_DEBUG=gc-friendly valgrind --tool=memcheck --leak-check=full \
--show-reachable=yes -v --log-file=$HOME/valgrind.log \
/usr/local/libexec/xfce4/panel-plugins/xfce4-sensors-plugin $@

Debug with GDB (short example)

If you didn't read the example about Valgrind, do so, it contains mandatory information if you don't understand the following example.

  • Make a copy of the desktop entry file
cp /usr/local/share/xfce4/panel-plugins/clipman.desktop \
/usr/local/share/xfce4/panel-plugins/clipman-gdb.desktop
  • Change the Exec= key to point it to the shell script (remember the original path, you need it for the shell script)
  • Create an executable shell script containing:
#!/bin/sh
gdb -ex r -ex bt -ex continue -ex q --args /usr/local/libexec/xfce4/panel-plugins/clipman $@ \
> $HOME/clipman-gdb.log 2>&1

Using GDB on running instances

If you want an interactive debug session with GDB, you can simply find the process id of the plugin by running

$ gdb /usr/local/libexec/xfce4/panel-plugins/clipman $(pidof clipman)
...
(gdb) continue

which will find the PID of clipman, and debug it using the debug symbols in /usr/local/libexec/xfce4/panel-plugins/clipman. For this to work, clipman must already be running. You can also attach GDB to a process from the GDB prompt by using the attach command:

(gdb) attach $PID

Again, the plugin must already be loaded for this to work.

Temporarily capturing messages to stdout and stderr

  • Add the plugin to the panel
  • Exit the panel:
$ xfce4-panel -x
  • Start panel capturing stdout and stderr to file. Note that this will capture all messages from the panel, including all plugins, to 'file':
$ xfce4-panel > file 2>&1 & disown
  • When done capturing, exit the panel and start it again:
$ xfce4-panel -x
$ xfce4-panel & disown

Some tips

  • By creating your own desktop entry file, it will never get overwritten by any installation, and the file doesn't cause any problem.
  • You can point the Exec= key to your development directory, for instance /home/john/clipman/panel-plugin/xfce4-clipman-plugin-gdb, and write the shell script xfce4-clipman-plugin-gdb that points to the binary inside your development directory aswell. This avoids you to install the binary every time, all you will need is to restart the panel (xfce4-panel -r) after you compile your plugin :-P