Today I uploaded a small library for comparing Haskell values using a textual diff. This has served me well when diagnosing failing tests, or comparing a function with a proposed replacement.
Let's try it on some disassembled x86 code:
$ ghci
λ> :m + Hdis86 Debug.Diff Data.ByteString
λ> let f = disassemble amd64 . pack
λ> diff (f [0x31,0xff,0x41,0x5e,0x48,0x89,0xc7])
(f [0x31,0xff,0x41,0x5c,0x48,0x89,0xc7])
--- /tmp/ddiff_x15061 2011-09-13 22:52:13.911842969 -0400
+++ /tmp/ddiff_y15061 2011-09-13 22:52:13.911842969 -0400
@@ -1,3 +1,3 @@
[Inst [] Ixor [Reg (Reg32 RDI), Reg (Reg32 RDI)],
- Inst [Rex] Ipop [Reg (Reg64 R14)],
+ Inst [Rex] Ipop [Reg (Reg64 R12)],
Inst [Rex] Imov [Reg (Reg64 RDI), Reg (Reg64 RAX)]]
This uses groom as a pretty-printer, and shells out to colordiff by default.
Sadly, a textual diff does not always produce usable results. I'm also interested in generic diffs for algebraic data types. There are some packages for this (1, 2) but I haven't yet learned how to use them. This could also be a good application for the new generics support in GHC 7.2.
No comments:
Post a Comment