Xfce Wiki

Sub domains
 

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
Last revisionBoth sides next revision
howto:panel_plugin_debug [2007/12/08 18:01] – created 88.172.125.130howto:panel_plugin_debug [2012/07/04 10:44] – [Temporarily capturing messages to stdout and stderr] belnac
Line 1: Line 1:
 ====== Panel Plugin Debugging ====== ====== Panel Plugin Debugging ======
 +Debugging **external** panel plugins is possible by wrapping the executable against a shell script that runs a debug tool.
  
-An easy way to debug an external panel-plugin with Valgrind :+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''.
  
-  in /usr/local/libexec/xfce4/panel-plugins/ (or where your plugins are +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. 
-installed) rename the panel binary named foo-plugin to foo-plugin.real + 
-  * create an executable shellscript named foo-plugin in the same place+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''"
-containing :+ 
 +===== 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 pathyou need it for the shell script) 
 +  * Create an **executable** shell script containing:
  
   #!/bin/sh   #!/bin/sh
-  valgrind --log-file=/path/to/valgrind.output /path/to/panel-plugins/foo-plugin.real $@+  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 <code>tail -f $HOME/clipman-valgrind.log</code> 
 + 
 +{{wiki:information.png}} 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>&
 + 
 +=== 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 as usual +  * Add the plugin to the panel 
-Note. It'll be really slow as wrapped in valgrind, but you'll be able to hunt memory leaks using tail -f /path/to/valgrind.output +  * Exit the panel:
  
 +  $ xfce4-panel -q
  
-==== Alternative way ==== +  * Start panel capturing stdout and stderr to file. Note that this will capture all messages from the panel, including all pluginsto 'file':
-Edit your .desktop file of the plugin (for most easy results, directly in the source directory) and append .valgrind to the xfce-exec line. Then create a file like described above, but named xfce4-my-plugin.valgrind in the same location. It will never ever be overwritten by any of your subsequent installationsand your .desktop file won't destroy anything as well. Ah, make the .valgrind script executable as well.+
  
-Pay attention to edit the xfce-exec line before checking into subversion or making a release.+  $ xfce4-panel > file 2>&1 & disown
  
 +  * When done capturing, exit the panel and start it again:
  
-==== More senseful call to Valgrind ====+  $ xfce4-panel -q 
 +  $ xfce4-panel & disown
  
-''valgrind --tool=memcheck --leak-check=full --show-reachable=yes -v --log-file=/home/user/valgrind.txt /usr/local/libexec/xfce4/panel-plugins/xfce4-sensors-plugin $@''+====== 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 Execkey 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