Skip to content

Commit

Permalink
scripts/gdb: port to python3 / gdb7.7
Browse files Browse the repository at this point in the history
I tried to use these scripts in an ubuntu 14.04 host (gdb 7.7 compiled
against python 3.3) but there were several errors.

I believe this patch fixes these issues so that the commands now work (I
tested lx-symbols, lx-dmesg, lx-lsmod).

Main issues that needed to be resolved:

  * In python 2 iterators have a "next()" method. In python 3 it is
    __next__() instead (so let's just add both).

  * In older python versions there was an implicit conversion
    in object.__format__() (used when an object is in string.format())
    where it was converting the object to str first and then
    calling str's __format__(). This has now been removed so
    we must explicitly convert to str the objects for which
    we need to keep this behavior.

  * In dmesg.py: in python 3 log_buf is now a "memoryview" object
    which needs to be converted to a string in order to use string
    methods like "splitlines()". Luckily memoryview exists in
    python 2.7.6 as well, so we can convert log_buf to memoryview
    and use the same code in both python 2 and python 3.

This version of the patch has now been tested with gdb 7.7 and both python
3.4 and python 2.7.6 (I think asking for at least python 2.7.6 is a
reasonable requirement instead of complicating the code with version
checks etc).

Signed-off-by: Pantelis Koukousoulas <[email protected]>
Signed-off-by: Jan Kiszka <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: Jason Wessel <[email protected]>
Cc: Andi Kleen <[email protected]>
Cc: Ben Widawsky <[email protected]>
Cc: Borislav Petkov <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
pkt authored and torvalds committed Feb 17, 2015
1 parent bda1a92 commit 276d97d
Show file tree
Hide file tree
Showing 6 changed files with 18 additions and 9 deletions.
5 changes: 4 additions & 1 deletion scripts/gdb/linux/cpus.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ def __init__(self, mask_name):
def __iter__(self):
return self

def next(self):
def __next__(self):
while self.bits == 0:
self.entry += 1
if self.entry == self.num_entries:
Expand All @@ -103,6 +103,9 @@ def next(self):

return cpu

def next(self):
return self.__next__()


class PerCpu(gdb.Function):
"""Return per-cpu variable.
Expand Down
3 changes: 2 additions & 1 deletion scripts/gdb/linux/dmesg.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,10 @@ def invoke(self, arg, from_tty):
continue

text_len = utils.read_u16(log_buf[pos + 10:pos + 12])
text = log_buf[pos + 16:pos + 16 + text_len]
time_stamp = utils.read_u64(log_buf[pos:pos + 8])

for line in log_buf[pos + 16:pos + 16 + text_len].splitlines():
for line in memoryview(text).tobytes().splitlines():
gdb.write("[{time:12.6f}] {line}\n".format(
time=time_stamp / 1000000000.0,
line=line))
Expand Down
9 changes: 6 additions & 3 deletions scripts/gdb/linux/modules.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,17 @@ def __init__(self):
def __iter__(self):
return self

def next(self):
def __next__(self):
entry = self.curr_entry
if entry != self.end_of_list:
self.curr_entry = entry['next']
return utils.container_of(entry, self.module_ptr_type, "list")
else:
raise StopIteration

def next(self):
return self.__next__()


def find_module_by_name(name):
for module in ModuleList():
Expand Down Expand Up @@ -91,8 +94,8 @@ def invoke(self, arg, from_tty):
gdb.write("{address} {name:<19} {size:>8} {ref}".format(
address=str(module['module_core']).split()[0],
name=module['name'].string(),
size=module['core_size'],
ref=ref))
size=str(module['core_size']),
ref=str(ref)))

source_list = module['source_list']
t = self._module_use_type.get_type().pointer()
Expand Down
4 changes: 2 additions & 2 deletions scripts/gdb/linux/symbols.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ def _update_module_files(self):

def _get_module_file(self, module_name):
module_pattern = ".*/{0}\.ko$".format(
string.replace(module_name, "_", r"[_\-]"))
module_name.replace("_", r"[_\-]"))
for name in self.module_files:
if re.match(module_pattern, name) and os.path.exists(name):
return name
Expand All @@ -87,7 +87,7 @@ def _section_arguments(self, module):
attrs = sect_attrs['attrs']
section_name_to_address = {
attrs[n]['name'].string() : attrs[n]['address']
for n in range(sect_attrs['nsections'])}
for n in range(int(sect_attrs['nsections']))}
args = []
for section_name in [".data", ".data..read_mostly", ".rodata", ".bss"]:
address = section_name_to_address.get(section_name)
Expand Down
4 changes: 3 additions & 1 deletion scripts/gdb/linux/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ def __init__(self):
def __iter__(self):
return self

def next(self):
def __next__(self):
t = self.curr_task
if not t or t == self.curr_group:
self.curr_group = \
Expand All @@ -45,6 +45,8 @@ def next(self):
self.task_ptr_type, "thread_group")
return t

def next(self):
return self.__next__()

def get_task_by_pid(pid):
for task in TaskList():
Expand Down
2 changes: 1 addition & 1 deletion scripts/gdb/linux/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(endian))
raise gdb.GdgError("unknown endianness '{0}'".format(str(endian)))
return target_endianness


Expand Down

0 comments on commit 276d97d

Please sign in to comment.