ctfdwdiff: Simple shell script for testing the CTF encoder/decoder
First it gets a file with DWARF info, converts that to CTF and adds
a ".SUNW_ctf" ELF section to the file with DWARF info. Double debugging
foo! Pay for one, take two!
For tcp_input.o for instance, the result is:
[acme@doppio pahole]$ cat /tmp/tcp_input.o.diff
--- /tmp/tcp_input.o.ctf.c 2009-03-19 19:48:23.000000000 -0300
+++ /tmp/tcp_input.o.dwarf.c 2009-03-19 19:48:23.000000000 -0300
@@ -1811,7 +1811,7 @@
/* XXX 6 bytes hole, try to pack */
- void (*call)(const struct marker *, void *); /* 24 8 */
+ void (*call)(const struct marker *, void *, ...); /* 24 8 */
struct marker_probe_closure single; /* 32 16 */
struct marker_probe_closure * multi; /* 48 8 */
const char * tp_name; /* 56 8 */
[acme@doppio pahole]$
Now back to figuring out how to encode a VARARGS marker in CTF...
Ah, to use the script just do:
./ctfdwdiff foo.o
Some will crash, but we're working hard for fuller customer
satisfaction.
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2009-03-19 23:50:09 +01:00
|
|
|
#!/bin/bash
|
|
|
|
|
2009-03-20 18:34:30 +01:00
|
|
|
results_dir=/tmp/ctfdwdiff
|
|
|
|
|
|
|
|
diff_one() {
|
|
|
|
local obj=$1
|
|
|
|
diff=$results_dir/$obj.diff
|
|
|
|
ctf=$results_dir/$obj.ctf.c
|
|
|
|
dwarf=$results_dir/$obj.dwarf.c
|
|
|
|
pahole -Z $obj
|
|
|
|
pahole -F ctf $obj > $ctf
|
|
|
|
pahole --flat_arrays \
|
|
|
|
--show_private_classes \
|
|
|
|
--fixup_silly_bitfields -F dwarf $obj > $dwarf
|
|
|
|
diff -up $dwarf $ctf > $diff
|
|
|
|
if [ -s $diff ] ; then
|
|
|
|
[ $# -gt 1 ] && vim $results_dir/$obj.diff
|
|
|
|
exit 0
|
|
|
|
else
|
|
|
|
rm -f $diff $ctf $dwarf
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2009-03-22 17:06:41 +01:00
|
|
|
diff_dir() {
|
|
|
|
find . -type d | \
|
|
|
|
while read dir ; do
|
|
|
|
cd $dir
|
|
|
|
ls *.o 2> /dev/null |
|
|
|
|
while read obj ; do
|
|
|
|
ncus=$(readelf -wi $obj | grep DW_TAG_compile_unit | wc -l)
|
|
|
|
if [ $ncus -ne 1 ] ; then
|
|
|
|
continue
|
|
|
|
fi
|
|
|
|
echo $obj
|
|
|
|
diff_one $obj $1
|
|
|
|
done
|
|
|
|
cd - > /dev/null
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2009-03-20 18:34:30 +01:00
|
|
|
rm -rf $results_dir
|
|
|
|
mkdir $results_dir
|
2009-03-22 17:06:41 +01:00
|
|
|
|
|
|
|
if [ $# -lt 2 ] ; then
|
|
|
|
diff_dir
|
|
|
|
else
|
|
|
|
diff_one $*
|
|
|
|
fi
|