add some pretty-printer for kthread
This commit is contained in:
parent
1f1f017224
commit
9fe6d3c7df
11
README.md
11
README.md
@ -16,3 +16,14 @@ To generate iso image
|
|||||||
you can also test it
|
you can also test it
|
||||||
|
|
||||||
`make self_test`
|
`make self_test`
|
||||||
|
|
||||||
|
# Debug
|
||||||
|
|
||||||
|
gdb could be launch with debug symbols using :
|
||||||
|
|
||||||
|
make debug
|
||||||
|
|
||||||
|
Then you can check some matos specific commands or pretty printing with
|
||||||
|
|
||||||
|
help user-defined
|
||||||
|
info pretty-printer (Should contains matos_pretty_printers)
|
||||||
|
@ -1,3 +1,48 @@
|
|||||||
|
from gdb.printing import PrettyPrinter, register_pretty_printer
|
||||||
|
import gdb
|
||||||
|
|
||||||
|
class KthreadPrettyPrinter(object):
|
||||||
|
|
||||||
|
def __init__(self, val):
|
||||||
|
self.val = val
|
||||||
|
|
||||||
|
def to_string(self):
|
||||||
|
result = ""
|
||||||
|
name = self.val["name"]
|
||||||
|
state = self.val["state"]
|
||||||
|
# Should get PC on stack for non-current thread otherwise will only get address in cpu_context_switch
|
||||||
|
cpuState = self.val["cpuState"]
|
||||||
|
cmdline = "info line *%s"%int(cpuState["eip"].cast(gdb.lookup_type("long").pointer()))
|
||||||
|
line = gdb.execute(cmdline, to_string=True)
|
||||||
|
#line = gdb.find_pc_line(int(cpuState["eip"].cast(gdb.lookup_type("long").pointer()).referenced_value()))
|
||||||
|
currentThread = gdb.parse_and_eval("currentThread")
|
||||||
|
if self.val == currentThread:
|
||||||
|
result += "->"
|
||||||
|
else:
|
||||||
|
result += " "
|
||||||
|
result += "Addr: 0x%x, name: %s, state: %s, PC: %s" % (self.val, name, state, line)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
class CustomPrettyPrinterLocator(PrettyPrinter):
|
||||||
|
"""Given a gdb.Value, search for a custom pretty printer"""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
super(CustomPrettyPrinterLocator, self).__init__(
|
||||||
|
"matos_pretty_printers", []
|
||||||
|
)
|
||||||
|
|
||||||
|
def __call__(self, val):
|
||||||
|
"""Return the custom formatter if the type can be handled"""
|
||||||
|
|
||||||
|
typename = gdb.types.get_basic_type(val.type).tag
|
||||||
|
if typename is None:
|
||||||
|
typename = val.type.name
|
||||||
|
|
||||||
|
if typename == "kthread":
|
||||||
|
return KthreadPrettyPrinter(val)
|
||||||
|
|
||||||
|
|
||||||
class KthreadListDumpCmd(gdb.Command):
|
class KthreadListDumpCmd(gdb.Command):
|
||||||
"""Prints the kthread list"""
|
"""Prints the kthread list"""
|
||||||
|
|
||||||
@ -16,8 +61,7 @@ class KthreadListDumpCmd(gdb.Command):
|
|||||||
kthread_ptr = val
|
kthread_ptr = val
|
||||||
result = ""
|
result = ""
|
||||||
while kthread_ptr != 0 and (idx == 0 or kthread_ptr != head) :
|
while kthread_ptr != 0 and (idx == 0 or kthread_ptr != head) :
|
||||||
name = kthread_ptr["name"]
|
result += "\n%d: %s" % (idx, KthreadPrettyPrinter(kthread_ptr).to_string())
|
||||||
result += "\n%d: Addr: 0x%x, name: %s" % (idx, kthread_ptr, name)
|
|
||||||
kthread_ptr = kthread_ptr["next"]
|
kthread_ptr = kthread_ptr["next"]
|
||||||
idx += 1
|
idx += 1
|
||||||
result = ("Found a Linked List with %d kthread:" % idx) + result
|
result = ("Found a Linked List with %d kthread:" % idx) + result
|
||||||
@ -32,13 +76,16 @@ class KthreadListDumpCmd(gdb.Command):
|
|||||||
# We can pass args here and use Python CLI utilities like argparse
|
# We can pass args here and use Python CLI utilities like argparse
|
||||||
# to do argument parsing
|
# to do argument parsing
|
||||||
print("Args Passed: %s" % args)
|
print("Args Passed: %s" % args)
|
||||||
|
if args:
|
||||||
kthread_ptr_val = gdb.parse_and_eval(args)
|
kthread_ptr_val = gdb.parse_and_eval(args)
|
||||||
|
else:
|
||||||
|
kthread_ptr_val = gdb.parse_and_eval("currentThread")
|
||||||
if str(kthread_ptr_val.type) != "struct kthread *":
|
if str(kthread_ptr_val.type) != "struct kthread *":
|
||||||
print("Expected pointer argument of type (struct kthread *)")
|
print("Expected pointer argument of type (struct kthread *)")
|
||||||
return
|
return
|
||||||
|
|
||||||
print(self._kthread_list_to_str(kthread_ptr_val))
|
print(self._kthread_list_to_str(kthread_ptr_val))
|
||||||
|
|
||||||
|
register_pretty_printer(None, CustomPrettyPrinterLocator(), replace=True)
|
||||||
KthreadListDumpCmd()
|
KthreadListDumpCmd()
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user