summaryrefslogtreecommitdiffstats
path: root/scripts/ksymoops/README
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/ksymoops/README')
-rw-r--r--scripts/ksymoops/README404
1 files changed, 6 insertions, 398 deletions
diff --git a/scripts/ksymoops/README b/scripts/ksymoops/README
index e38ee2c10..c463b4c71 100644
--- a/scripts/ksymoops/README
+++ b/scripts/ksymoops/README
@@ -1,399 +1,7 @@
- ksymoops.
+ksymoops has been removed from the kernel. It was always meant to be a
+free standing utility, not linked to any particular kernel version.
+The latest version can be found in ftp://ftp.ocs.com.au/pub/ksymoops,
+together with patches to other utilities in order to give more accurate
+Oops debugging.
- Read a kernel Oops file and make the best stab at converting the code to
- instructions and mapping stack values to kernel symbols.
-
- Copyright Keith Owens <kaos@ocs.com.au>.
- Released under the GNU Public Licence, Version 2.
-
- To compile, simply type "make" in the ksymoops directory.
-
- TESTERS WANTED.
-
- ksymoops handles ix86. It appears to handle Alpha, Sparc, M68K, PPC,
- MIPS but I have no machine to test on. I would appreciate feedback
- from users of non ix86 machines. In particular, it would be nice if
- you could run
-
- ksymoops -VMO -k /proc/ksyms -dd <oops.file >/tmp/ksymoops.log 2>&1
-
- and mail /tmp/ksymoops.log to kaos@ocs.com.au
-
- TODO:
- Clean up these docs.
- Tweak System.map to include arch information.
- Tweak modutils to log at least one symbol for each module loaded,
- otherwise they are invisible to ksymoops. Also arch and version data.
- Include sparc/sparc64 patches from Jakub Jelinek <jj@sunsite.mff.cuni.cz>.
- Add object format override for sparc/soparc64 or any cross platform
- oops debugging.
-
- Mon Jan 4 09:48:13 EST 1999
- Version 0.6e
- Added to kernel.
- Add ARM support.
- Typo in oops_code.
- Add -c option.
- Add -1 option.
- Report if options were specified or defaulted.
- Remove false warnings when comparing ksyms and lsmod.
- Performance inprovements.
-
- Wed Oct 28 23:14:55 EST 1998
- Version 0.5
- No longer read vmlinux by default, it only duplicates System.map.
-
- Wed Oct 28 13:46:39 EST 1998
- Version 0.4
- Split into separate sources.
-
- Mon Oct 26 00:01:47 EST 1998
- Version 0.3c
- Add alpha (arm) processing.
-
- Mon Oct 26 00:01:47 EST 1998
- Version 0.3b
- Add sparc processing.
- Handle kernel symbol versions.
-
- Fri Oct 23 13:11:20 EST 1998
- Version 0.3
- Add -follow to find command for people who use symlinks to modules.
- Add Version_ checking.
-
- Thu Oct 22 22:28:30 EST 1998
- Version 0.2.
- Generalise text prefix handling.
- Handle messages on Code: line.
- Format addresses with leading zeroes.
- Minor bug fixes.
-
- Wed Oct 21 23:28:48 EST 1998
- Version 0.1. Rewrite from scratch in C.
-
- CREDITS.
- Oops disassembly based on ksymoops.cc,
- Copyright (C) 1995 Greg McGary <gkm@magilla.cichlid.com>
- m68k code based on ksymoops.cc changes by
- Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
-
- This code subsumes the Perl script make_System.map.pl which is no longer
- supported.
-
- Why another ksymoops I hear you ask? Various complaints about
- ksymoops.cc -
-
- * It requires C++.
- * It has hard wired limitations on the number of symbols.
- * It does not handle modules at all.
- * Very rigid requirements on the format of input, especially the Oops
- log.
- * No cross checking between ksyms, modules, System.map etc.
- * Very little error checking, diagnostics are not suitable for
- beginners.
- * It only prints the trace and decoded code, users have to manually
- extract the other lines from the Oops.
- * Gives up on the slightest problem.
- * Only handles i386 and possibly m68k. The code is difficult to extend
- to other architectures.
- * Stops after the first Oops, you have to manually extract each one and
- run through ksymoops one at a time.
-
- This version is -
- * C.
- * No hard wired limitations (malloc as far as the eye can see).
- * Handles modules by default.
- * Uses regular pattern matching so it is a lot more forgiving about
- input formats.
- * By default, cross checks ksyms, modules, System.map and vmlinux.
- * Lots of diagnostics and error checking.
- * Prints all relevant lines for a complete Oops report.
- * Tries to provide output no matter how bad the input is. The level of
- progress and error reporting is aimed at beginners.
- * Handles i386, alpha, sparc, sparc64, m68k. It is a lot easier to extend
- to other architectures (patches and/or sample data gratefully accepted).
- * Handles all Oops in the input file(s).
-
-
- Usage: ksymoops
- [-v vmlinux] Where to read vmlinux
- [-V] No vmlinux is available
- [-o object_dir] Directory containing modules
- [-O] No modules is available
- [-k ksyms] Where to read ksyms
- [-K] No ksyms is available
- [-l lsmod] Where to read lsmod
- [-L] No lsmod is available
- [-m system.map] Where to read System.map
- [-M] No System.map is available
- [-s save.map] Save consolidated map
- [-c code_bytes] How many bytes in each unit of code
- [-1] One shot toggle (exit after first Oops)
- [-d] Increase debug level by 1
- [-h] Print help text
- Oops.file Oops to decode
-
- All flags can occur more than once. With the exception of -o
- and -d which are cumulative, the last occurrence of each flag is
- used. Note that "-v my.vmlinux -V" will be taken as "No vmlinux
- available" but "-V -v my.vmlinux" will read my.vmlinux. You
- will be warned about such combinations.
-
- Each occurrence of -d increases the debug level.
-
- Each -o flag can refer to a directory or to a single object
- file. If a directory is specified then all *.o files in that
- directory and its subdirectories are assumed to be modules.
-
- If any of the vmlinux, object_dir, ksyms or system.map options
- contain the string *r (*m, *n, *s) then it is replaced at run time
- by the current value of `uname -r` (-m, -n, -s).
-
- The defaults can be changed in the Makefile, typical options are
-
- Defaults: -V
- -o /lib/modules/%r
- -k /proc/ksyms
- -l /proc/modules
- -m /usr/src/linux/System.map
- -c 1
- Oops report is read from stdin
-
- Note: Unless you tell ksymoops *NOT* to read a particular file, it
- will try to read and reconcile almost all possible sources of kernel
- symbol information. This is intended for beginners, they just
- type
-
- ksymoops < /var/log/syslog
-
- no thinking required. Experts can point at different files or
- suppress the input from selected files. For example, if you
- save /proc/ksyms before doing a test that creates an Oops, you
- can point ksymoops at the saved ksyms instead of using
- /proc/ksyms.
-
- vmlinux is not read by default, it only duplicates the
- information in System.map. If you want to read vmlinux as well
- as or instead of System.map, use -v.
-
- To get the equivalent of the old ksymoops.cc (no vmlinux, no
- modules objects, no ksyms, no System.map) just do ksymoops
- -VOKLM. Or to just read System.map, ksymoops -VOKL -m mapfile.
-
-
- Return codes: 0 - normal.
- 1 - error(s) or warning(s) issued, results may not be
- reliable.
- 2 - fatal error, no useful results.
- 3 - One shot mode, end of input reached.
-
- Supported architectures
-
- i386 tested.
- m68k code derived from ksymoops.cc and reading traps.c, untested.
- MIPS tested.
- Sparc tested.
- Sparc64 tested.
- Alpha tested.
- ARM tested.
-
- The term "eip" is generic, for example it includes the i386 EIP
- and the m68k PC. Remember that objdump output always says EIP,
- no matter what the architecture, see objfile_head.
-
- To support another arch, check the Oops_ procedures between
- 'Start architecture sensitive code' and 'End architecture
- sensitive code'.
-
- The pattern matching should take care of different lengths for
- the address, i.e. addresses should not be arch sensitive. I
- assume that all addresses are at least 4 characters.
-
- If nm output has a different format on your arch, check for uses
- of re_nm.
-
-
-
- Because ksymoops reads kernel information from multiple sources, there
- could be mismatches. ksymoops does the following cross checks, but only
- if the specified files exist -
-
- * Compare Version_nnn numbers from all sources against each other. Pity
- that only vmlinux and System.map have these symbols (as at 2.1.125),
- however I check ksyms, modules and Oops as well. If somebody adds
- symbol Version_nnn to ksyms or modules or adds a Version_nnn line to
- the Oops log, this code is ready.
-
- * Compare kernel ksyms against vmlinux. vmlinux takes precedence.
-
- * Compare System.map against vmlinux. vmlinux takes precedence.
-
- * Compare vmlinux against System.map. vmlinux takes precedence.
-
- * Compare kernel ksyms against System.map. System.map takes precedence.
-
- * Compare modules against module ksyms. modules take precedence. Only
- if at least one module appears in ksyms.
-
- * Compare module names in ksyms against lsmod. Warn if a module
- appears in lsmod but not in ksyms. Error if a modules appears in
- ksyms but is not in lsmod. Only if both ksyms and lsmod have being
- read.
-
- The precedence order is somewhat arbitrary, however it only applies if
- there is any difference between the various sources.
-
- Handling modules is awkward. They can be loaded under different names
- (insmod -o dummy1 dummy.o) and the text, data and read only data are
- loaded at different offsets. Although you can give the -m option to
- insmod which will output the module map when it is loaded, this has a
- few problems -
-
- * No equivalent for removing a module. If you load and remove a lot of
- modules, you end up with multiple sets of symbols around the same
- offsets, which set is correct?
-
- * "insmod -o dummy1 dummy.o" still reports as dummy. That is, there is
- no way of telling which particular version of a multiply loaded
- module the insmod output refers to. Therefore there is no way of
- telling which instantiation failed.
-
- * Even if the above problems are fixed, how do you tell what the module
- environment looked like when the Oops occurred? What if a module is
- loaded or removed just after Oops, how is the user expected to edit
- the insmod log? Rule 1 - make ksymoops easy for beginners.
-
- Although those problems could be fixed, they require changes to
- modutils. Working from ksyms and the module objects can be done without
- changing modutils and without confusing beginners.
-
- Alas the ksyms plus object approach has another problem - matching ksyms
- to module objects. Nowhere does the kernel say that module dummy1 came
- from module /lib/modules/2.1.215/net/dummy.o, ksyms just says dummy1. I
- have to match ksyms to the relevant object by finding a globally unique
- external symbol in each module that can be used to map to the external
- symbols in ksyms. This assumes that each module exports at least one
- text symbol that is unique amongst all modules.
-
- It may not be possible to correctly map other sections such as data and
- readonly data for modules because they may not have exported symbols.
- Since the main aim of ksymoops is to map a code Oops, this should not be
- a problem.
-
- Unfortunately some modules export no symbols. They are marked as
- EXPORT_NO_SYMBOLS are simply do not export anything. It is
- impossible to detect these in ksyms because, by definition, ksyms
- only contains exported symbols for modules. Since all modules appear
- in lsmod (/proc/modules), a cross check of lsmod against the module
- names will find loaded modules with no symbols, at least I can warn
- about these.
-
- After merging the various sources, ksymoops has a (hopefully) accurate
- map including modules. The -s option lets you save the merged
- System.map, but remember that module data and readonly data sections may
- not be correctly relocated, see above.
-
- Environment Variables.
- KSYMOOPS_NM path for nm, defaults to /usr/bin/nm.
- KSYMOOPS_FIND path for find, defaults to /usr/bin/find.
- KSYMOOPS_OBJDUMP path for objdump, defaults to /usr/bin/objdump.
-
-
- Input Oops data.
-
- The ideal input is to feed the syslog straight into this program. If
- you cannot do that, you need to know what the program looks for.
- Especially if you are typing in the Oops by hand :(. All input is case
- insensitive.
-
- * White space in this context means space or tab. It does not include
- newline.
-
- * Oops in syslog has a syslog prefix. Leading text up to and including
- ' kernel: ' is always ignored, there is no need to edit syslog first.
- This leading text need not exist but if it does, it must end in
- ' kernel: '.
-
- * An alternative prefix is <n> where n is the kernel print level. Also
- ignored if present.
-
- * Leading white space is treated as a prefix and ignored, the input is
- not indentation sensitive.
-
- * In the following paragraphs, assume that any prefixes have been
- skipped. If there is more than one prefix, all are skipped, no matter
- which order they appear in.
-
- * A bracketed address is optional '[', required '<', at least 4 hex
- digits, required '>', optional ']'. For example [<01234567>] or
- <1234>.
-
- * The ix86 EIP line is identified by optional white space followed by
- 'EIP:', followed by a least one white space, followed by a bracketed
- address.
-
- * The m68k PC line is identified by optional white space followed by
- 'PC', optionally followed by white space, followed by '=', optionally
- followed by white space, followed by a bracketed address.
-
- * The sparc PC line starts with PSR and PC is the second hex value, not
- bracketed.
-
- * The sparc64 TPC line starts with TSTATE and TPC is the second hex value,
- not bracketed.
-
- * A call trace line is identified by 'Call Trace:' followed by at least
- one white space. Or it is a line starting with a bracketed address,
- but only if the previous line was a call trace line (I hate multi line
- output that relies on identation for recognition, especially when
- lines can have a variable prefix).
-
- * The Code line is identified by 'Code:' followed by a least one white
- space character followed by at least one hex value. The line can
- contain multiple hex values, each separated by at least one white
- space. Each hex value must be 2 to 8 digits and must be a multiple of
- 2 digits.
-
- On some architectures the Code: data is a stream of single bytes,
- in machine order. On other architectures, it is a stream of shorts
- or ints in human readable order which does not always match the
- machine order, endianess raises its ugly head. We are consistently
- inconsistent.
-
- To cater for these architecture inconsistencies, use the -c option.
- If the Code: line is already in machine order, use -c 1. If the
- Code: data is a stream of shorts or ints which do not match the
- machine order, use -c 2 or -c 4. Each set of 'c' bytes are swapped
- to (hopefully) reflect the machine order.
-
- Special cases where Code: can be followed by text.
- 'Code: general protection'
- 'Code: <n>'
- Dump the data anyway, the code was unavailable.
-
- * Formatted data is only output when the Code: line is seen. If any
- data has been stored and more than 5 lines other than Oops text (see
- Oops_print) or end of file are encountered then ksymoops assumes that
- the Code: line is missing or garbled and dumps the formatted data
- anyway. Fail safe, I hope.
-
- * By default, ksymoops reads its entire input file. If the -1 toggle
- is set, it will run in one shot mode and exit after the first Oops.
- This is useful for automatically mailing reports as they happen,
- like this :-
-
- #!/bin/sh
- # ksymoops1
- while (true)
- do
- ksymoops -1 > $HOME/oops1
- if [ $? -eq 3 ]
- then
- exit 0
- fi
- mail -s Oops admin < $HOME/oops1
- done
-
- tail -f /var/log/messages | ksymoops1
-
- Restarting after log rotation is left as an exercise for the reader.
+Keith Owens <kaos@ocs.com.au> Sat Jun 19 10:30:34 EST 1999