diff --git a/linux-ramdump-parser-v2/parsers/memusage.py b/linux-ramdump-parser-v2/parsers/memusage.py index e610f429f6d194ae7af46d0523e73f403c82191a..1e20ac9a36b426e421f2bdd79ffc9e5b0e54c4f8 100644 --- a/linux-ramdump-parser-v2/parsers/memusage.py +++ b/linux-ramdump-parser-v2/parsers/memusage.py @@ -72,9 +72,9 @@ def do_dump_process_memory(ramdump): adj = ramdump.read_u16(signal_struct + offset_adj) if adj & 0x8000: adj = adj - 0x10000 - rss = get_rss(ramdump, task_struct) * 4 + rss, swap = get_rss(ramdump, task_struct) if rss != 0: - task_info.append([thread_task_name, thread_task_pid, rss, adj]) + task_info.append([thread_task_name, thread_task_pid, rss, swap, rss + swap, adj]) next_task = ramdump.read_word(init_next_task) if next_task is None: break @@ -92,13 +92,13 @@ def do_dump_process_memory(ramdump): if init_next_task == orig_init_next_task: break - task_info = sorted(task_info, key=lambda l: l[2], reverse=True) - str = '{0:<17s}{1:>8s}{2:>17s}{3:>8}\n'.format( - 'Task name', 'PID', 'RSS in kB', 'ADJ') + task_info = sorted(task_info, key=lambda l: l[4], reverse=True) + str = '{0:<17s}{1:>8s}{2:>19s}{3:>12s}{4:>8}\n'.format( + 'Task name', 'PID', 'RSS in kB', 'SWAP in kB', 'ADJ') memory_file.write(str) for item in task_info: - str = '{0:<17s}{1:8d}{2:13,d}({3:2.1f}%) {4:6}\n'.format( - item[0], item[1], item[2], (100.0 * item[2]) / total_mem, item[3]) + str = '{0:<17s}{1:8d}{2:13,d}({4:2.1f}%){3:13,d} {5:6}\n'.format( + item[0], item[1], item[2], item[3], (100.0 * item[2]) / total_mem, item[5]) memory_file.write(str) memory_file.close() print_out_str('---wrote meminfo to memory.txt') @@ -107,24 +107,32 @@ def do_dump_process_memory(ramdump): def get_rss(ramdump, task_struct): offset_mm = ramdump.field_offset('struct task_struct', 'mm') offset_rss_stat = ramdump.field_offset('struct mm_struct', 'rss_stat') - offset_rss = ramdump.field_offset('struct mm_rss_stat', 'count') + offset_file_rss = ramdump.field_offset('struct mm_rss_stat', 'count') offset_anon_rss = ramdump.field_offset('struct mm_rss_stat', 'count[1]') - offset_file_rss = ramdump.field_offset('struct mm_rss_stat', 'count[2]') + offset_swap_rss = ramdump.field_offset('struct mm_rss_stat', 'count[2]') + if ramdump.kernel_version >= (4, 9): + offset_shmem_rss = ramdump.field_offset('struct mm_rss_stat', 'count[3]') mm_struct = ramdump.read_word(task_struct + offset_mm) if mm_struct == 0: - return 0 + return 0, 0 anon_rss = ramdump.read_word(mm_struct + offset_rss_stat + offset_anon_rss) - rss = ramdump.read_word(mm_struct + offset_rss_stat + offset_rss) + swap_rss = ramdump.read_word(mm_struct + offset_rss_stat + offset_swap_rss) file_rss = ramdump.read_word(mm_struct + offset_rss_stat + offset_file_rss) + if ramdump.kernel_version >= (4, 9): + shmem_rss = ramdump.read_word(mm_struct + offset_rss_stat + offset_shmem_rss) + else: + shmem_rss = 0 # Ignore negative RSS values if anon_rss > 0x80000000: anon_rss = 0 - if rss > 0x80000000: - rss = 0 + if swap_rss > 0x80000000: + swap_rss = 0 if file_rss > 0x80000000: file_rss = 0 - total_rss = rss + anon_rss + file_rss - return total_rss + if shmem_rss > 0x80000000: + shmem_rss = 0 + total_rss = anon_rss + file_rss + shmem_rss + return total_rss * 4, swap_rss * 4 @register_parser('--print-memory-info', 'Print memory usage info')