Using Valgrind and gdb in Scratchbox

Image:Ambox_content.png
This is an article from the old midgard wiki that hasn't yet been fully updated for this wiki, please update it.
Please see the talk page for discussion.


Some hints for using valgrind tools in Scratchbox+Maemo

These commands work in the 386 scratchbox target.

First, standard way to use valgrind and gdb. af-sb-init.sh supports parameters for using these tools with a piece of software we want to study:

af-sb-init.sh start --valgrind=my_app
af-sb-init.sh start --gdb=my_app

Valgrind will store the results in /tmp/valgrind-my_app.log*. Gdb will show its prompt on load of my_app. This way you can debug/valgrind the program you want.

An interesting example would be: "I want to valgrind my status bar applet". And this is easy:

af-sb-init.sh start --valgrind=maemo_af_desktop

You'll get the results in /tmp/valgrind-maemo_af_desktop.log*

If you want to run other valgrind tools, you would better use these environment variables: * VALGRINDCMD: the command you want to run inside valgrind. * VALGRIND: the valgrind command and parameters.

For example, if you want to run massif of maemo_af_desktop, you would run:

 export VALGRINDCMD=maemo_af_desktop
 export VALGRIND="valgrind <del>tool=massif </del>num-callers=50
        <del>trace-children=yes </del>depth=5 <del>format=html </del>log-file=/tmp/massif
        <del>alloc-fn=g_malloc </del>alloc-fn=g_malloc0 --alloc-fn=g_realloc
        <del>alloc-fn=g_slice_alloc </del>alloc-fn=g_try_malloc
       - -alloc-fn=g_slice_alloc0"
 af-sb-init.sh start
 ... do your stuff ...
 af-sb-init.sh stop

And you'll get your massif reports in /tmp (logs) and $PWD (html and postscripts).

If you want valgrind and gdb to find debug packages in Scratchbox, you need to do something like this:

 #!/bin/sh
 # symlinks for debug symfiles in sbox
 mkdir -p /usr/lib/debug/targets
 cd /usr/lib/debug/targets
 ln -sf /usr/lib/debug $(sh -c '. /targets/links/scratchbox.config;echo $SBOX_TARGET_NAME')

This is because when Gdb uses "realpath" on libraries in Sbox it gets a path starting with /targets//... You can see the effect of this if you "strace" Valgrind (or Gdb).

When using Valgrind, you need to remember to use:

export G_SLICE="always-malloc"

Otherwise Valgrind will report bogus leaks (see Gnome Bugzilla for more information on Glib Gslice and Valgrind).

Another thing to remember about Gdb is that the Maemo Sbox cross-gdb cannot debug ARM (EABI) core dumps. You need target Gdb for this. However, because Sbox will use the host (cross-gdb) binary if it exists, you need to tell Sbox to ignore that:

 #!/bin/sh
 # use native Gdb in Scratchbox
 SBOX_REDIRECT_IGNORE=/usr/bin/gdb /usr/bin/gdb $*

You can check which Gdb is used with "gdb -v". If it says "--host=i686-pc-linux-gnu" on ARM target, it's a cross-gdb.