Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/kern lockdebug(9): Try to show symbol names if possible.
details: https://anonhg.NetBSD.org/src/rev/cb5f4d78d3ea
branches: trunk
changeset: 369771:cb5f4d78d3ea
user: riastradh <riastradh%NetBSD.org@localhost>
date: Tue Aug 30 22:38:17 2022 +0000
description:
lockdebug(9): Try to show symbol names if possible.
Also print the possible owner in ddb/crash `show lock' even if the
kernel is built without LOCKDEBUG.
Output may not be as pretty before with two neatly aligned columns,
but that can be changed; for now the value of having the symbols
printed instead of just obscure hex addresses (which one's an lwp
address and which one's a code pointer? can never remember!) should
outweigh the prettiness temporarily lost.
diffstat:
sys/kern/subr_lockdebug.c | 72 ++++++++++++++++++++++++++++++++++++----------
1 files changed, 56 insertions(+), 16 deletions(-)
diffs (140 lines):
diff -r 6f24c6757020 -r cb5f4d78d3ea sys/kern/subr_lockdebug.c
--- a/sys/kern/subr_lockdebug.c Tue Aug 30 22:38:01 2022 +0000
+++ b/sys/kern/subr_lockdebug.c Tue Aug 30 22:38:17 2022 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: subr_lockdebug.c,v 1.80 2021/03/02 01:20:35 rin Exp $ */
+/* $NetBSD: subr_lockdebug.c,v 1.81 2022/08/30 22:38:17 riastradh Exp $ */
/*-
* Copyright (c) 2006, 2007, 2008, 2020 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_lockdebug.c,v 1.80 2021/03/02 01:20:35 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_lockdebug.c,v 1.81 2022/08/30 22:38:17 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_ddb.h"
@@ -712,6 +712,7 @@
#include <machine/db_machdep.h>
#include <ddb/db_interface.h>
#include <ddb/db_access.h>
+#include <ddb/db_sym.h>
#endif
/*
@@ -725,12 +726,34 @@
{
int sleeper = (ld->ld_flags & LD_SLEEPER);
lockops_t *lo = ld->ld_lockops;
+ char locksym[128], initsym[128], lockedsym[128], unlockedsym[128];
+
+#ifdef DDB
+ db_symstr(locksym, sizeof(locksym), (db_expr_t)ld->ld_lock,
+ DB_STGY_ANY);
+ db_symstr(initsym, sizeof(initsym), (db_expr_t)ld->ld_initaddr,
+ DB_STGY_PROC);
+ db_symstr(lockedsym, sizeof(lockedsym), (db_expr_t)ld->ld_locked,
+ DB_STGY_PROC);
+ db_symstr(unlockedsym, sizeof(unlockedsym), (db_expr_t)ld->ld_unlocked,
+ DB_STGY_PROC);
+#else
+ snprintf(locksym, sizeof(locksym), "%#018lx",
+ (unsigned long)ld->ld_lock);
+ snprintf(initsym, sizeof(initsym), "%#018lx",
+ (unsigned long)ld->ld_initaddr);
+ snprintf(lockedsym, sizeof(lockedsym), "%#018lx",
+ (unsigned long)ld->ld_locked);
+ snprintf(unlockedsym, sizeof(unlockedsym), "%#018lx",
+ (unsigned long)ld->ld_unlocked);
+#endif
(*pr)(
- "lock address : %#018lx type : %18s\n"
- "initialized : %#018lx",
- (long)ld->ld_lock, (sleeper ? "sleep/adaptive" : "spin"),
- (long)ld->ld_initaddr);
+ "lock address : %s\n"
+ "type : %s\n"
+ "initialized : %s",
+ locksym, (sleeper ? "sleep/adaptive" : "spin"),
+ initsym);
#ifndef _KERNEL
lockops_t los;
@@ -742,15 +765,16 @@
"shares wanted: %18u exclusive: %18u\n"
"relevant cpu : %18u last held: %18u\n"
"relevant lwp : %#018lx last held: %#018lx\n"
- "last locked%c : %#018lx unlocked%c: %#018lx\n",
+ "last locked%c : %s\n"
+ "unlocked%c : %s\n",
(unsigned)ld->ld_shares, ((ld->ld_flags & LD_LOCKED) != 0),
(unsigned)ld->ld_shwant, (unsigned)ld->ld_exwant,
(unsigned)cpu_index(l->l_cpu), (unsigned)ld->ld_cpu,
(long)l, (long)ld->ld_lwp,
((ld->ld_flags & LD_LOCKED) ? '*' : ' '),
- (long)ld->ld_locked,
+ lockedsym,
((ld->ld_flags & LD_LOCKED) ? ' ' : '*'),
- (long)ld->ld_unlocked);
+ unlockedsym);
#ifdef _KERNEL
if (lo->lo_dump != NULL)
@@ -827,7 +851,14 @@
addr);
}
#else
- (*pr)("Sorry, kernel not built with the LOCKDEBUG option.\n");
+ char sym[128];
+ uintptr_t word;
+
+ (*pr)("WARNING: lock print is unreliable without LOCKDEBUG\n");
+ db_symstr(sym, sizeof(sym), (db_expr_t)addr, DB_STGY_ANY);
+ db_read_bytes((db_addr_t)addr, sizeof(word), &word);
+ (*pr)("%s: possible owner: %p, bits: 0x%x\n", sym,
+ (void *)(word & ~(uintptr_t)ALIGNBYTES), word & ALIGNBYTES);
#endif /* LOCKDEBUG */
}
@@ -837,11 +868,12 @@
lockdebug_show_one(lwp_t *l, lockdebug_t *ld, int i,
void (*pr)(const char *, ...) __printflike(1, 2))
{
- const char *sym;
+ char sym[128];
-#ifdef _KERNEL
- ksyms_getname(NULL, &sym, (vaddr_t)ld->ld_initaddr,
- KSYMS_CLOSEST|KSYMS_PROC|KSYMS_ANY);
+#ifdef DDB
+ db_symstr(sym, sizeof(sym), (db_expr_t)ld->ld_initaddr, DB_STGY_PROC);
+#else
+ snprintf(sym, sizeof(sym), "%p", (void *)ld->ld_initaddr);
#endif
(*pr)("* Lock %d (initialized at %s)\n", i++, sym);
lockdebug_dump(l, ld, pr);
@@ -1040,11 +1072,19 @@
if (atomic_inc_uint_nv(&ld_panic) > 1)
return;
+ char locksym[128];
+
+#ifdef DDB
+ db_symstr(locksym, sizeof(locksym), (db_expr_t)lock, DB_STGY_ANY);
+#else
+ snprintf(locksym, sizeof(locksym), "%#018lx", (unsigned long)lock);
+#endif
+
printf("%s error: %s,%zu: %s\n\n"
- "lock address : %#018lx\n"
+ "lock address : %s\n"
"current cpu : %18d\n"
"current lwp : %#018lx\n",
- ops->lo_name, func, line, msg, (long)lock,
+ ops->lo_name, func, line, msg, locksym,
(int)cpu_index(curcpu()), (long)curlwp);
(*ops->lo_dump)(lock, printf);
printf("\n");
Home |
Main Index |
Thread Index |
Old Index