From b02616f5b1e1867073967e9773e0f72a88bea9d6 Mon Sep 17 00:00:00 2001 From: wadesong <wadesong@codeaurora.org> Date: Sun, 16 Jul 2017 00:29:47 +0800 Subject: [PATCH] lrdp-v2: Correct SLUB track address calculation SLUB allocation and freeing tracking storage address calculation doesn't take into account the length of the red zone header, resulting in incorrect stack dump when Linux RAM dump parser is used to parse(with --slabinfo option)dumps generated with SLUB_DEBUG options enabled. Change-Id: I50f4c6d304ff1ecd57bfddb1bfa9441ff5cb3ac1 --- linux-ramdump-parser-v2/parsers/slabinfo.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/linux-ramdump-parser-v2/parsers/slabinfo.py b/linux-ramdump-parser-v2/parsers/slabinfo.py index ff9dcac..28a3dfd 100644 --- a/linux-ramdump-parser-v2/parsers/slabinfo.py +++ b/linux-ramdump-parser-v2/parsers/slabinfo.py @@ -76,6 +76,11 @@ class kmem_cache(object): self.inuse = ramdump.read_int(addr + offset) if self.inuse is None: return + offset = ramdump.field_offset( + 'struct kmem_cache', 'red_left_pad') + self.red_left_pad = ramdump.read_int(addr + offset) + if self.red_left_pad is None: + self.red_left_pad = 0 self.addr = addr self.valid = True @@ -147,9 +152,9 @@ class Slabinfo(RamParser): def get_track(self, ramdump, slab, obj, track_type): track_size = g_offsetof.sizeof_struct_track if slab.offset != 0: - p = obj + slab.offset + g_offsetof.sizeof_void_pointer + p = obj + slab.red_left_pad + slab.offset + g_offsetof.sizeof_void_pointer else: - p = obj + slab.inuse + p = obj + slab.red_left_pad + slab.inuse return p + track_type * track_size def extract_callstack(self, ramdump, stack, out_file): -- GitLab