Merge branch 'akpm' (patches from Andrew)
Merge third patchbomb from Andrew Morton: - the rest of MM - scripts/gdb updates - ipc/ updates - lib/ updates - MAINTAINERS updates - various other misc things * emailed patches from Andrew Morton <akpm@linux-foundation.org>: (67 commits) genalloc: rename of_get_named_gen_pool() to of_gen_pool_get() genalloc: rename dev_get_gen_pool() to gen_pool_get() x86: opt into HAVE_COPY_THREAD_TLS, for both 32-bit and 64-bit MAINTAINERS: add zpool MAINTAINERS: BCACHE: Kent Overstreet has changed email address MAINTAINERS: move Jens Osterkamp to CREDITS MAINTAINERS: remove unused nbd.h pattern MAINTAINERS: update brcm gpio filename pattern MAINTAINERS: update brcm dts pattern MAINTAINERS: update sound soc intel patterns MAINTAINERS: remove website for paride MAINTAINERS: update Emulex ocrdma email addresses bcache: use kvfree() in various places libcxgbi: use kvfree() in cxgbi_free_big_mem() target: use kvfree() in session alloc and free IB/ehca: use kvfree() in ipz_queue_{cd}tor() drm/nouveau/gem: use kvfree() in u_free() drm: use kvfree() in drm_free_large() cxgb4: use kvfree() in t4_free_mem() cxgb3: use kvfree() in cxgb_free_mem() ...
This commit is contained in:
@@ -12,7 +12,6 @@
|
||||
#
|
||||
|
||||
import gdb
|
||||
import string
|
||||
|
||||
from linux import utils
|
||||
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
#
|
||||
# gdb helper commands and functions for Linux kernel debugging
|
||||
#
|
||||
# list tools
|
||||
#
|
||||
# Copyright (c) Thiebaud Weksteen, 2015
|
||||
#
|
||||
# Authors:
|
||||
# Thiebaud Weksteen <thiebaud@weksteen.fr>
|
||||
#
|
||||
# This work is licensed under the terms of the GNU GPL version 2.
|
||||
#
|
||||
|
||||
import gdb
|
||||
|
||||
from linux import utils
|
||||
|
||||
list_head = utils.CachedType("struct list_head")
|
||||
|
||||
|
||||
def list_check(head):
|
||||
nb = 0
|
||||
if (head.type == list_head.get_type().pointer()):
|
||||
head = head.dereference()
|
||||
elif (head.type != list_head.get_type()):
|
||||
raise gdb.GdbError('argument must be of type (struct list_head [*])')
|
||||
c = head
|
||||
try:
|
||||
gdb.write("Starting with: {}\n".format(c))
|
||||
except gdb.MemoryError:
|
||||
gdb.write('head is not accessible\n')
|
||||
return
|
||||
while True:
|
||||
p = c['prev'].dereference()
|
||||
n = c['next'].dereference()
|
||||
try:
|
||||
if p['next'] != c.address:
|
||||
gdb.write('prev.next != current: '
|
||||
'current@{current_addr}={current} '
|
||||
'prev@{p_addr}={p}\n'.format(
|
||||
current_addr=c.address,
|
||||
current=c,
|
||||
p_addr=p.address,
|
||||
p=p,
|
||||
))
|
||||
return
|
||||
except gdb.MemoryError:
|
||||
gdb.write('prev is not accessible: '
|
||||
'current@{current_addr}={current}\n'.format(
|
||||
current_addr=c.address,
|
||||
current=c
|
||||
))
|
||||
return
|
||||
try:
|
||||
if n['prev'] != c.address:
|
||||
gdb.write('next.prev != current: '
|
||||
'current@{current_addr}={current} '
|
||||
'next@{n_addr}={n}\n'.format(
|
||||
current_addr=c.address,
|
||||
current=c,
|
||||
n_addr=n.address,
|
||||
n=n,
|
||||
))
|
||||
return
|
||||
except gdb.MemoryError:
|
||||
gdb.write('next is not accessible: '
|
||||
'current@{current_addr}={current}\n'.format(
|
||||
current_addr=c.address,
|
||||
current=c
|
||||
))
|
||||
return
|
||||
c = n
|
||||
nb += 1
|
||||
if c == head:
|
||||
gdb.write("list is consistent: {} node(s)\n".format(nb))
|
||||
return
|
||||
|
||||
|
||||
class LxListChk(gdb.Command):
|
||||
"""Verify a list consistency"""
|
||||
|
||||
def __init__(self):
|
||||
super(LxListChk, self).__init__("lx-list-check", gdb.COMMAND_DATA,
|
||||
gdb.COMPLETE_EXPRESSION)
|
||||
|
||||
def invoke(self, arg, from_tty):
|
||||
argv = gdb.string_to_argv(arg)
|
||||
if len(argv) != 1:
|
||||
raise gdb.GdbError("lx-list-check takes one argument")
|
||||
list_check(gdb.parse_and_eval(argv[0]))
|
||||
|
||||
LxListChk()
|
||||
@@ -14,9 +14,8 @@
|
||||
import gdb
|
||||
import os
|
||||
import re
|
||||
import string
|
||||
|
||||
from linux import modules, utils
|
||||
from linux import modules
|
||||
|
||||
|
||||
if hasattr(gdb, 'Breakpoint'):
|
||||
@@ -97,7 +96,7 @@ lx-symbols command."""
|
||||
return ""
|
||||
attrs = sect_attrs['attrs']
|
||||
section_name_to_address = {
|
||||
attrs[n]['name'].string() : attrs[n]['address']
|
||||
attrs[n]['name'].string(): attrs[n]['address']
|
||||
for n in range(int(sect_attrs['nsections']))}
|
||||
args = []
|
||||
for section_name in [".data", ".data..read_mostly", ".rodata", ".bss"]:
|
||||
@@ -124,7 +123,7 @@ lx-symbols command."""
|
||||
addr=module_addr,
|
||||
sections=self._section_arguments(module))
|
||||
gdb.execute(cmdline, to_string=True)
|
||||
if not module_name in self.loaded_modules:
|
||||
if module_name not in self.loaded_modules:
|
||||
self.loaded_modules.append(module_name)
|
||||
else:
|
||||
gdb.write("no module object found for '{0}'\n".format(module_name))
|
||||
@@ -164,7 +163,7 @@ lx-symbols command."""
|
||||
self.load_all_symbols()
|
||||
|
||||
if hasattr(gdb, 'Breakpoint'):
|
||||
if not self.breakpoint is None:
|
||||
if self.breakpoint is not None:
|
||||
self.breakpoint.delete()
|
||||
self.breakpoint = None
|
||||
self.breakpoint = LoadModuleBreakpoint(
|
||||
|
||||
@@ -18,8 +18,8 @@ from linux import utils
|
||||
|
||||
task_type = utils.CachedType("struct task_struct")
|
||||
|
||||
|
||||
def task_lists():
|
||||
global task_type
|
||||
task_ptr_type = task_type.get_type().pointer()
|
||||
init_task = gdb.parse_and_eval("init_task").address
|
||||
t = g = init_task
|
||||
@@ -38,6 +38,7 @@ def task_lists():
|
||||
if t == init_task:
|
||||
return
|
||||
|
||||
|
||||
def get_task_by_pid(pid):
|
||||
for task in task_lists():
|
||||
if int(task['pid']) == pid:
|
||||
@@ -65,13 +66,28 @@ return that task_struct variable which PID matches."""
|
||||
LxTaskByPidFunc()
|
||||
|
||||
|
||||
class LxPs(gdb.Command):
|
||||
"""Dump Linux tasks."""
|
||||
|
||||
def __init__(self):
|
||||
super(LxPs, self).__init__("lx-ps", gdb.COMMAND_DATA)
|
||||
|
||||
def invoke(self, arg, from_tty):
|
||||
for task in task_lists():
|
||||
gdb.write("{address} {pid} {comm}\n".format(
|
||||
address=task,
|
||||
pid=task["pid"],
|
||||
comm=task["comm"].string()))
|
||||
|
||||
LxPs()
|
||||
|
||||
|
||||
thread_info_type = utils.CachedType("struct thread_info")
|
||||
|
||||
ia64_task_size = None
|
||||
|
||||
|
||||
def get_thread_info(task):
|
||||
global thread_info_type
|
||||
thread_info_ptr_type = thread_info_type.get_type().pointer()
|
||||
if utils.is_target_arch("ia64"):
|
||||
global ia64_task_size
|
||||
|
||||
@@ -83,7 +83,7 @@ def get_target_endianness():
|
||||
elif "big endian" in endian:
|
||||
target_endianness = BIG_ENDIAN
|
||||
else:
|
||||
raise gdb.GdgError("unknown endianness '{0}'".format(str(endian)))
|
||||
raise gdb.GdbError("unknown endianness '{0}'".format(str(endian)))
|
||||
return target_endianness
|
||||
|
||||
|
||||
@@ -151,6 +151,6 @@ def get_gdbserver_type():
|
||||
gdbserver_type = GDBSERVER_QEMU
|
||||
elif probe_kgdb():
|
||||
gdbserver_type = GDBSERVER_KGDB
|
||||
if not gdbserver_type is None and hasattr(gdb, 'events'):
|
||||
if gdbserver_type is not None and hasattr(gdb, 'events'):
|
||||
gdb.events.exited.connect(exit_handler)
|
||||
return gdbserver_type
|
||||
|
||||
@@ -28,3 +28,4 @@ else:
|
||||
import linux.dmesg
|
||||
import linux.tasks
|
||||
import linux.cpus
|
||||
import linux.lists
|
||||
|
||||
Reference in New Issue
Block a user