Using GDB to debug programs is great and all, but if you work with Scientific data then one really critical function is the ability to plot a long array or vector, to see how the solution is evolving at various stages.
After a bit of tinkering, I was able to take this code snippet and modify it for my needs. It had just a few problems:
- The syntax they used for labeling things fell apart when I was using Eigen vectors, the -> became shell redirects.
- It didn’t link very long (100+) entry arrays.
So I modified it like so:
# plot1d.gdb # # Copyright (C) 2008 Florian Lorenzen # - Taken from https://sourceware.org/gdb/wiki/PlottingFromGDB # Modified by Randall Hand to actually make it work. # original version seemed to badly handle variable names # like esf->data[0]@1024 (turning the > into a pipe redirect) # # Plot an expression that expands to {x1, x2, ..., xN}, i. e. # N numbers using gnuplot. # # This file is for the GNU debugger 6.x. # # It writes temporary files named __plot1d.dump, __plot1d.dat, __plot1d.gp, so # you should not have files of the same name in the working directory. # # It requires sed, awk, and gnuplot available in the $PATH. # plot1d_opt_range <expr> <opt> <range> # # Plot the points of <expr> passing <opt> as plot options using # <range> in the set yrange command. define plot1d_opt_range shell rm -f /tmp/__plot1d.dump /tmp/__plot1d.dat /tmp/__plot1d.gp set logging file /tmp/__plot1d.dump set logging on set logging redirect on set height 0 set print elements unlimited output $arg0 set logging off set logging redirect off shell awk '{printf("%s", $0)}' < /tmp/__plot1d.dump | \ sed 's/^{\(.*\)}$/\1/;s/, */\n/g' > /tmp/__plot1d.dat shell echo 'plot "/tmp/__plot1d.dat" title "$arg0"; pause -1 "Press enter to continue"' > /tmp/__plot1d.gp shell gnuplot /tmp/__plot1d.gp # shell rm -f /tmp/__plot1d.dump /tmp/__plot1d.dat /tmp/__plot1d.gp end # plot1d <expr> # # Just plot the points of <expr>. define plot1d plot1d_opt_range $arg0 "" "[*:*]" end # plot1d_opt <expr> <opt> # # Plot the points of <expr> passing <opt> to the # plot command after the datafile. So, one can pass # "with lines" here. define plot1d_opt plot1d_opt_range $arg0 $arg1 "[*:*]" end
With this file placed somewhere and executed, you can then simply do
plot1d data[0]@128
to get a nice plot of the first 128 values of `data`.And if you like it so much you want to keep it, simply add
source plot1d.gdb
(which a path to wherever you put it) to your ~/.gdbinit