def invoke(self, args, from_tty): ifnot constants.LX_CONFIG_PAGE_OWNER: raise gdb.GdbError('CONFIG_PAGE_OWNER does not enable')
page_owner_inited = gdb.parse_and_eval('page_owner_inited') if page_owner_inited['key']['enabled']['counter'] != 0x1: raise gdb.GdbError('page_owner_inited is not enabled')
if page_ext == gdb.Value(0):
gdb.write("page_ext is null\n") return
ifnot (page_ext['flags'] & (1 << PAGE_EXT_OWNER)):
gdb.write("page_owner flag is invalid\n") raise gdb.GdbError('page_owner info is not present (never set?)\n')
if mm.test_bit(PAGE_EXT_OWNER_ALLOCATED, page_ext['flags'].address):
gdb.write('page_owner tracks the page as allocated\n') else:
gdb.write('page_owner tracks the page as freed\n')
ifnot (page_ext['flags'] & (1 << PAGE_EXT_OWNER_ALLOCATED)):
gdb.write("page_owner is not allocated\n")
if page_owner["free_handle"] == 0:
gdb.write('page_owner free stack trace missing\n') else:
gdb.write('page last free stack trace:\n')
stackdepot.stack_depot_print(page_owner["free_handle"]) if page_owner['last_migrate_reason'] != -1:
gdb.write('page has been migrated, last migrate reason: %s\n' % self.migrate_reason_names[page_owner['last_migrate_reason']])
def read_page_owner(self):
pfn = self.min_pfn
# Find a valid PFN or the start of a MAX_ORDER_NR_PAGES area while ((not self.p_ops.pfn_valid(pfn)) and (pfn & (self.p_ops.MAX_ORDER_NR_PAGES - 1))) != 0:
pfn += 1
while pfn < self.max_pfn: # # If the new page is in a new MAX_ORDER_NR_PAGES area, # validate the area as existing, skip it if not # if ((pfn & (self.p_ops.MAX_ORDER_NR_PAGES - 1)) == 0) and (not self.p_ops.pfn_valid(pfn)):
pfn += (self.p_ops.MAX_ORDER_NR_PAGES - 1) continue;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.