mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2024-12-29 17:22:07 +00:00
scripts/gdb/stackdepot: add stackdepot support
Add support for printing the backtrace of stackdepot handle. This is the preparation patch for dumping page_owner, slabtrace usage. Link: https://lkml.kernel.org/r/20230808083020.22254-6-Kuan-Ying.Lee@mediatek.com Signed-off-by: Kuan-Ying Lee <Kuan-Ying.Lee@mediatek.com> Cc: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Cc: Chinwen Chang <chinwen.chang@mediatek.com> Cc: Matthias Brugger <matthias.bgg@gmail.com> Cc: Qun-Wei Lin <qun-wei.lin@mediatek.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
eb985b5dbf
commit
0e1b240a4b
@ -128,3 +128,4 @@ LX_CONFIG(CONFIG_VMAP_STACK)
|
||||
if IS_BUILTIN(CONFIG_NUMA):
|
||||
LX_VALUE(CONFIG_NODES_SHIFT)
|
||||
LX_CONFIG(CONFIG_DEBUG_VIRTUAL)
|
||||
LX_CONFIG(CONFIG_STACKDEPOT)
|
||||
|
55
scripts/gdb/linux/stackdepot.py
Normal file
55
scripts/gdb/linux/stackdepot.py
Normal file
@ -0,0 +1,55 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
#
|
||||
# Copyright (c) 2023 MediaTek Inc.
|
||||
#
|
||||
# Authors:
|
||||
# Kuan-Ying Lee <Kuan-Ying.Lee@mediatek.com>
|
||||
#
|
||||
|
||||
import gdb
|
||||
from linux import utils, constants
|
||||
|
||||
if constants.LX_CONFIG_STACKDEPOT:
|
||||
stack_record_type = utils.CachedType('struct stack_record')
|
||||
DEPOT_STACK_ALIGN = 4
|
||||
|
||||
def stack_depot_fetch(handle):
|
||||
global DEPOT_STACK_ALIGN
|
||||
global stack_record_type
|
||||
|
||||
stack_depot_disabled = gdb.parse_and_eval('stack_depot_disabled')
|
||||
|
||||
if stack_depot_disabled:
|
||||
raise gdb.GdbError("stack_depot_disabled\n")
|
||||
|
||||
handle_parts_t = gdb.lookup_type("union handle_parts")
|
||||
parts = handle.cast(handle_parts_t)
|
||||
offset = parts['offset'] << DEPOT_STACK_ALIGN
|
||||
pool_index_cached = gdb.parse_and_eval('pool_index')
|
||||
|
||||
if parts['pool_index'] > pool_index_cached:
|
||||
gdb.write("pool index %d out of bounds (%d) for stack id 0x%08x\n" % (parts['pool_index'], pool_index_cached, handle))
|
||||
return gdb.Value(0), 0
|
||||
|
||||
stack_pools = gdb.parse_and_eval('stack_pools')
|
||||
|
||||
try:
|
||||
pool = stack_pools[parts['pool_index']]
|
||||
stack = (pool + gdb.Value(offset).cast(utils.get_size_t_type())).cast(stack_record_type.get_type().pointer())
|
||||
size = int(stack['size'].cast(utils.get_ulong_type()))
|
||||
return stack['entries'], size
|
||||
except Exception as e:
|
||||
gdb.write("%s\n" % e)
|
||||
return gdb.Value(0), 0
|
||||
|
||||
def stack_depot_print(handle):
|
||||
if not constants.LX_CONFIG_STACKDEPOT:
|
||||
raise gdb.GdbError("CONFIG_STACKDEPOT is not enabled")
|
||||
|
||||
entries, nr_entries = stack_depot_fetch(handle)
|
||||
if nr_entries > 0:
|
||||
for i in range(0, nr_entries):
|
||||
try:
|
||||
gdb.execute("x /i 0x%x" % (int(entries[i])))
|
||||
except Exception as e:
|
||||
gdb.write("%s\n" % e)
|
@ -45,3 +45,4 @@ else:
|
||||
import linux.radixtree
|
||||
import linux.interrupts
|
||||
import linux.mm
|
||||
import linux.stackdepot
|
||||
|
Loading…
Reference in New Issue
Block a user