diff --git a/linux-ramdump-parser-v2/ramdump.py b/linux-ramdump-parser-v2/ramdump.py index deeab0be53d309570da1ef8ce9e8c9421f8a947d..9bc7127c42cd66cdf46e99f9a8f43edb88ef6ad4 100644 --- a/linux-ramdump-parser-v2/ramdump.py +++ b/linux-ramdump-parser-v2/ramdump.py @@ -1216,16 +1216,58 @@ class RamDump(): return struct.unpack(format_string, s) def hexdump(self, address, length, virtual=True, file_object=None): - """Does a hexdump (in the format of `xxd'). `length' is in bytes. If - given, will write to `file_object', otherwise will write to - stdout. + """Returns a string with a hexdump (in the format of `xxd'). + + `length' is in bytes. + + Example (intentionally not in doctest format since it would require + a specific dump to be loaded to pass as a doctest): + + PY>> print(dump.hexdump(dump.addr_lookup('linux_banner') - 0x100, 0x200)) + c0afff6b: 0000 0000 0000 0000 0000 0000 0000 0000 ................ + c0afff7b: 0000 0000 0000 0000 0000 0000 0000 0000 ................ + c0afff8b: 0000 0000 0000 0000 0000 0000 0000 0000 ................ + c0afff9b: 0000 0000 0000 0000 0000 0000 0000 0000 ................ + c0afffab: 0000 0000 0000 0000 0000 0000 0000 0000 ................ + c0afffbb: 0000 0000 0000 0000 0000 0000 0000 0000 ................ + c0afffcb: 0000 0000 0000 0000 0000 0000 0000 0000 ................ + c0afffdb: 0000 0000 0000 0000 0000 0000 0000 0000 ................ + c0afffeb: 0000 0000 0000 0000 0000 0000 0000 0000 ................ + c0affffb: 0000 0000 0069 6e69 7463 616c 6c5f 6465 .....initcall_de + c0b0000b: 6275 6700 646f 5f6f 6e65 5f69 6e69 7463 bug.do_one_initc + c0b0001b: 616c 6c5f 6465 6275 6700 2573 2076 6572 all_debug.%s ver + c0b0002b: 7369 6f6e 2025 7320 286c 6e78 6275 696c sion %s (lnxbuil + c0b0003b: 6440 6162 6169 7431 3532 2d73 642d 6c6e d@abait152-sd-ln + c0b0004b: 7829 2028 6763 6320 7665 7273 696f 6e20 x) (gcc version + c0b0005b: 342e 3720 2847 4343 2920 2920 2573 0a00 4.7 (GCC) ) %s.. + c0b0006b: 4c69 6e75 7820 7665 7273 696f 6e20 332e Linux version 3. + c0b0007b: 3130 2e30 2d67 6137 3362 3831 622d 3030 10.0-ga73b81b-00 + c0b0008b: 3030 392d 6732 6262 6331 3235 2028 6c6e 009-g2bbc125 (ln + c0b0009b: 7862 7569 6c64 4061 6261 6974 3135 322d xbuild@abait152- + c0b000ab: 7364 2d6c 6e78 2920 2867 6363 2076 6572 sd-lnx) (gcc ver + c0b000bb: 7369 6f6e 2034 2e37 2028 4743 4329 2029 sion 4.7 (GCC) ) + c0b000cb: 2023 3120 534d 5020 5052 4545 4d50 5420 #1 SMP PREEMPT + c0b000db: 5765 6420 4170 7220 3136 2031 333a 3037 Wed Apr 16 13:07 + c0b000eb: 3a30 3420 5044 5420 3230 3134 0a00 7c2f :04 PDT 2014..|/ + c0b000fb: 2d5c 0000 0000 0000 00d4 7525 c0c8 7625 -\........u%..v% + c0b0010b: c000 0000 0000 0000 0000 0000 0000 0000 ................ + c0b0011b: 0000 0000 0000 0000 0000 0000 0000 0000 ................ + c0b0012b: 00e0 0b10 c000 0000 0094 7025 c000 0000 ..........p%.... + c0b0013b: 0000 0000 0000 0000 0000 0000 0000 0000 ................ + c0b0014b: 0000 0000 0000 0000 0000 0000 0000 0000 ................ + c0b0015b: 0000 0000 0000 0000 0000 0000 0000 0000 ................ """ + import StringIO + sio = StringIO.StringIO() parser_util.xxd( address, [self.read_byte(address + i, virtual=virtual) or 0 for i in xrange(length)], - file_object=file_object) + file_object=sio) + ret = sio.getvalue() + sio.close() + return ret def per_cpu_offset(self, cpu): per_cpu_offset_addr = self.addr_lookup('__per_cpu_offset')