README
1#
2# CDDL HEADER START
3#
4# The contents of this file are subject to the terms of the
5# Common Development and Distribution License, Version 1.0 only
6# (the "License"). You may not use this file except in compliance
7# with the License.
8#
9# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10# or http://www.opensolaris.org/os/licensing.
11# See the License for the specific language governing permissions
12# and limitations under the License.
13#
14# When distributing Covered Code, include this CDDL HEADER in each
15# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16# If applicable, add the following below this CDDL HEADER, with the
17# fields enclosed by brackets "[]" replaced with your own identifying
18# information: Portions Copyright [yyyy] [name of copyright owner]
19#
20# CDDL HEADER END
21#
22
23Copyright 2005 Sun Microsystems, Inc. All rights reserved.
24Use is subject to license terms.
25
26Copyright 2022 Garrett D'Amore
27
28
291. Introduction
30
31This directory contains source code for sample debugger modules for the Modular
32Debugger (MDB). These modules demonstrate how developers can use the MDB
33programming API to extend the capabilities of MDB itself. MDB is an extensible
34utility for low-level debugging and editing of the live operating system,
35operating system crash dumps, user processes, user process core dumps, and
36object files. For a more detailed description of MDB features and documentation
37for the MDB programming API, refer to the manual, "Solaris Modular Debugger
38Guide". This document is available on-line at http://docs.sun.com.
39
402. Configuration
41
42As the files in this directory are owned by the administrator, you should make
43a copy of this directory to your home directory or other location before you
44begin experimenting with MDB. If you wish to change the configuration, edit
45the CC macro definitions in Makefile.i386 and Makefile.amd64 to point to the
46appropriate pathnames.
47
48The Makefiles contained in this directory are set up to use the C compiler (cc)
49found in your $PATH. These four Makefiles can also be used to define base
50compiler settings for the corresponding instruction set architecture (ISA):
51
52 Makefile.i386 - rules for building 32-bit x86 objects
53 Makefile.amd64 - rules for building 64-bit x86 objects
54
55The Makefile.common file adds common compiler and linker flags to these base
56definitions, and defines the rules for building the example modules. You will
57not need to change any of the definitions here in order to build the examples.
58If you wish to construct additional modules of your own, edit the MODULES macro
59at the top of Makefile.common. For example, if you create a new module source
60file common/mymodule.c, you should change:
61
62< MODULES = example1.so example2.so
63
64to:
65
66> MODULES = example1.so example2.so mymodule.so
67
68and then execute "make".
69
703. Targets
71
72The Makefile in this directory supports the following targets:
73
74 make all (default) - build all modules for the current machine
75 make clean - remove object files from build directories
76 make clobber - remove objects, and modules
77
78To build the example modules, execute "make" in this directory. This will
79execute the default "make all" target.
80
814. Loading Modules
82
83After you successfully compile the example modules, the module object files
84reside in one or more of the i386/, amd64/ subdirectories
85depending on the ISAs supported on your machine. In order to load the example
86modules, you can either use the ::load built-in dcmd with the absolute pathname
87of a given module, or you can adjust the module library path to include the
88directory where your modules are located. This can be done using the ::set -L
89built-in dcmd. For example:
90
91 > ::set -L %o:/usr/demo/mdb/%i
92 > ::load example1
93
94The %o token expands to the old value of the path. The %i token expands to
95the appropriate ISA name. You can restore this setting each time you use
96MDB by adding the ::set directive to your $HOME/.mdbrc file. This file, if
97present, is processed automatically each time you start the debugger.
98
995. Example 1: Echo and Vmstat
100
101The first example module provides the source code for two example loadable
102dcmds. ::simple_echo is a command to echo back its arguments, similar to
103/usr/bin/echo or MDB's built-in ::echo dcmd. ::vminfo is a command to read
104and print the kernel's global virtual memory statistics structure. This
105example introduces the basic structure of an MDB module and demonstrates some
106simple argument processing. In order to use ::vminfo, you will need to apply
107MDB to a crash dump of your system, or to the live kernel. To apply MDB to a
108crash dump, you might execute:
109
110 $ mdb unix.0 vmcore.0
111
112To apply MDB to the live kernel, become super-user and then execute:
113
114 # mdb -k
115
1166. Example 2: Proc Walker and PS
117
118The second example module provides a more realistic example of something you
119might want to do with MDB: print a formatted table of active processes,
120similar to the /usr/bin/ps command or MDB's ::ps dcmd. This example
121introduces the concept of a walker, a set of functions which describe how to
122iterate over a data structure, and them demonstrates how the ::simple_ps
123dcmd can be built using this walker. Using the simple_proc walker, you can
124obtain a listing of kernel proc_t addresses:
125
126 > ::load example2
127 > ::walk simple_proc
128 71690a80
129 7168ee40
130 71611898
131 [ ... ]
132 7103b178
133 7103b888
134 1041ce20
135
136Using the ::simple_ps dcmd you can obtain a formatted listing of processes:
137
138 > ::simple_ps
139 PID COMM
140 285 sh
141 271 mibiisa
142 269 ttymon
143 [ ... ]
144
1457. Packaging and Installation
146
147If you are a software developer, you may wish to develop and deliver MDB
148modules along with your software products in order to facilitate analysis
149of software problems at customer sites. Your completed MDB modules should
150be packaged along with your software and delivered into the appropriate
151MDB module directory. For kernel debugging modules, your module should
152be delivered in one of the following directories:
153
154 /usr/lib/mdb/kvm
155 /usr/platform/`uname -i`/lib/mdb/kvm
156
157and should be named after your kernel module. For example, the "ip" kernel
158module has a debugging module named "ip.so".
159