ksymoops.8
上传用户:hxtd_72
上传日期:2007-06-06
资源大小:64k
文件大小:36k
源码类别:

驱动编程

开发平台:

C/C++

  1. .TH KSYMOOPS 8 "July 20, 2002"
  2. .hy 0
  3. .UC 4
  4. .SH NAME
  5. ksymoops - a utility to decode Linux kernel Oops
  6. .SH SYNOPSIS
  7. .B ksymoops
  8. .br
  9. [ fB-v fIvmlinuxfR ]
  10. [ fB--vmlinux=fIvmlinuxfR ]
  11. [ fB-VfR ]
  12. [ fB--no-vmlinuxfR ]
  13. .br
  14. [ fB-k fIksymsfR ]
  15. [ fB--ksyms=fIksymsfR ]
  16. [ fB-KfR ]
  17. [ fB--no-ksymsfR ]
  18. .br
  19. [ fB-l fIlsmodfR ]
  20. [ fB--lsmod=fIlsmodfR ]
  21. [ fB-LfR ]
  22. [ fB--no-lsmodfR ]
  23. .br
  24. [ fB-o fIobjectfR ]
  25. [ fB--object=fIobjectfR ]
  26. [ fB-OfR ]
  27. [ fB--no-objectfR ]
  28. .br
  29. [ fB-m fIsystem.mapfR ]
  30. [ fB--system-map=fIsystem.mapfR ]
  31. [ fB-MfR ]
  32. [ fB--no-system-mapfR ]
  33. .br
  34. [ fB-s fIsave.mapfR ]
  35. [ fB--save-map=fIsave.mapfR ]
  36. .br
  37. [ fB-SfR ]
  38. [ fB--short-linesfR ]
  39. .br
  40. [ fB-efR ]
  41. [ fB--endian-swapfR ]
  42. .br
  43. [ fB-xfR ]
  44. [ fB--hexfR ]
  45. .br
  46. [ fB-1fR ]
  47. [ fB--one-shotfR ]
  48. .br
  49. [ fB-ifR ]
  50. [ fB--ignore-insmod-pathfR ]
  51. .br
  52. [ fB-IfR ]
  53. [ fB--ignore-insmod-allfR ]
  54. .br
  55. [ fB-T fItruncatefR ]
  56. [ fB--truncate=fItruncatefR ]
  57. .br
  58. [ fB-dfR ]
  59. [ fB--debugfR ]
  60. .br
  61. [ fB-hfR ]
  62. [ fB--helpfR ]
  63. .br
  64. [ fB-t fItargetfR ]
  65. [ fB--target=fItargetfR ]
  66. .br
  67. [ fB-a fIarchitecturefR ]
  68. [ fB--architecture=fIarchitecturefR ]
  69. .br
  70. [ fB-A fI"address list"fR ]
  71. [ fB--addresses=fI"address list"fR ]
  72. .br
  73. [ fIOops.file ...fR ]
  74. .SH DESCRIPTION
  75. ksymoops extracts kernel Oops reports from the Oops.file and uses
  76. various sources of symbol information to convert the addresses and code
  77. to meaningful text.  Reporting a kernel Oops is meaningless on its own
  78. because other people do not know what your kernel looks like, you need
  79. to feed the Oops text through ksymoops then send the ksymoops output as
  80. part of your bug report.
  81. .P
  82. The ksymoops executable is meant to be run whenever you have Oops to
  83. report.  The original Oops text can come from anywhere.  Typically it
  84. is in a file created by your syslogd(8).  If syslogd is not available,
  85. the log might be available via dmesg(8).  If you are running a serial
  86. console (see linux/Documentation/serial-console.txt) then you can
  87. capture the Oops text on another machine.  If all else fails, copy the
  88. Oops by hand from the screen, reboot and enter it by hand.
  89. .P
  90. ksymoops can be run by anybody who has read access to the various input
  91. files.  It does not have to be run as root.
  92. .SH OPTIONS
  93. .P
  94. Some of the options have default values that are set in the Makefile.
  95. The text below describes the standard defaults but your distribution
  96. may have been modified to use different defaults.  If in doubt,
  97. fIksymoops -hfR will list the current defaults.
  98. .P
  99. The first 10 options (fB-vfR, fB-VfR, fB-kfR, fB-KfR, fB-lfR,
  100. fB-LfR, fB-ofR, fB-OfR, fB-mfR, fB-MfR or the corresponding
  101. long forms) are 5 pairs.  The lower case options (vklom) take a value
  102. and turn the option on, the upper case options (VKLOM) take no value
  103. and turn the option off.  If you specify both lower and upper case
  104. versions of the same option then the last one is used but you are
  105. warned that it may not be what you intended.
  106. .P
  107. .ne 5
  108. ksymoops will run quite happily with no options.  However there is a
  109. risk that the default values for the symbol sources may not be
  110. suitable.  Therefore if none of
  111. fB-v fIvmlinuxfR, fB-VfR,
  112. fB-k fIksymsfR, fB-KfR,
  113. fB-l fIlsmodfR, fB-LfR,
  114. fB-o fIobjectfR, fB-OfR,
  115. fB-m fIsystem.mapfR or fB-MfR
  116. are specified, ksymoops prints a warning message.
  117. .IP "" 4
  118. You did not tell me where to find symbol information.  I will assume
  119. that the log matches the kernel and modules that are running right now
  120. and I'll use the default options above for symbol resolution.
  121. If the current kernel and/or modules do not match the log, you can get
  122. more accurate output by telling me the kernel version and where to find
  123. map, modules, ksyms etc.  ksymoops -h explains the options.
  124. .P
  125. If any of the
  126. fB-v fIvmlinuxfR,
  127. fB-k fIksymsfR,
  128. fB-l fIlsmodfR,
  129. fB-o fIobjectfR or
  130. fB-m fIsystem.mapfR
  131. options contain the string *r (*m, *n, *s) then the string is replaced
  132. at run time by the current value of `uname -r` (-m, -n, -s).  This is
  133. mainly intended to let ksymoops automatically pick up version dependent
  134. files using its default parameters, however it could be used by bug
  135. reporting scripts to automatically pick up files whose name or
  136. directory depends on the current kernel.
  137. .TP
  138. fB-v fIvmlinuxfR fB--vmlinux=fIvmlinuxfR
  139. Name of the vmlinux file that corresponds to the failing kernel.
  140. fBNote:fR This is the vmlinux file, not zImage, bzImage, vmlinuz
  141. etc.  Typically this would be /usr/src/linux/vmlinux.  If you specify
  142. fB-vfR, you should only specify it once.
  143. .TP
  144. fB-VfR fB--no-vmlinuxfR
  145. Do not read any vmlinux file.
  146. .P
  147. Default is fB-VfR.
  148. .TP
  149. fB-k fIksymsfR fB--ksyms=fIksymsfR
  150. Where to find the list of kernel symbols at the time of the failure.
  151. Unfortunately the kernel symbol list in /proc/ksyms is volatile, it is
  152. updated as modules are loaded and removed.  Try to copy /proc/ksyms to
  153. a normal file as soon as possible after the Oops and point ksymoops at
  154. that copy using fB-kfR.  Modutils has support for automatically
  155. copying ksyms and lsmod data, see insmod(8).  If you had to reboot
  156. after the Oops and you do not have a copy of /proc/ksyms at the time of
  157. the Oops, try to reload the same modules in the same order before
  158. running ksymoops.  If you specify fB-kfR, you should only specify it
  159. once.
  160. .TP
  161. fB-KfR fB--no-ksymsfR
  162. Do not read any kernel symbols.
  163. .P
  164. Default is fB-k fI/proc/ksymsfR.
  165. .TP
  166. fB-l fIlsmodfR fB--lsmod=fIlsmodfR
  167. Where to find the list of loaded modules at the time of the failure.
  168. Unfortunately the list in /proc/modules is volatile, it is updated as
  169. modules are loaded and removed.  Try to copy /proc/modules to a normal
  170. file as soon as possible after the Oops and point ksymoops at that copy
  171. using fB-lfR.  Modutils has support for automatically copying ksyms
  172. and lsmod data, see insmod(8).  If you had to reboot after the Oops and
  173. you do not have a copy of /proc/modules at the time of the Oops, try to
  174. reload the same modules in the same order before running ksymoops.  If
  175. you specify fB-lfR, you should only specify it once.
  176. .TP
  177. fB-LfR fB--no-lsmodfR
  178. Do not read any list of loaded modules.
  179. .P
  180. Default is fB-l fI/proc/modulesfR.
  181. .TP
  182. fB-o fIobjectfR fB--object=fIobjectfR
  183. Where to find the objects for modules used by the failing kernel.  This
  184. can be a directory name or an individual file.  If it is a directory
  185. then ksymoops does a recursive find(1) in that directory for all files
  186. matching '*.o'.  fB-ofR can be specified more than once, the list is
  187. cumulative and can contain a mixture of directories and files.
  188. fBNote:fR When you specify a directory, ksymoops only uses files that
  189. end in '.o'.  Any modules with non-standard names are ignored unless
  190. you specify those files explicitly.  For example, if vmnet and vmmon
  191. modules do not end in '.o', you need something like this to pick up all
  192. the normal modules plus the non-standard names.
  193. .nf
  194.   fB-o fI/lib/modules/*r/fB \fR
  195.   fB-o fI/lib/modules/*r/misc/vmnetfB \fR
  196.   fB-o fI/lib/modules/*r/misc/vmmonfR
  197. .fi
  198. If you are using a version of insmod(8) that stores the module filename
  199. in /proc/ksyms, ksymoops can go directly to that file, it does not need
  200. fB-ofR.  The fB-ofR option is only used when ksyms contains at
  201. least one module whose filename is not explicitly listed in ksyms.
  202. .TP
  203. fB-OfR fB--no-objectfR
  204. Do not scan for any objects.  If /proc/ksyms is supplied and insmod
  205. added the ksymoops assistance symbols (starting with __insmod) then
  206. those symbols are used to access the objects, no directory scanning is
  207. done so neither -o nor -O have any effect.  To completely disable the
  208. use of module objects when ksyms contains __insmod symbols, specify -O
  209. fBandfR one of -i or -I.
  210. .P
  211. Default is fB-o fI/lib/modules/*r/fR.  For example, if
  212. uname -r reports 2.2.7, ksymoops uses
  213. fB-o fI/lib/modules/2.2.7/fR, but only if it does not already know
  214. where the objects are.
  215. .TP
  216. fB-m fIsystem.mapfR fB--system-map=fIsystem.mapfR
  217. Where to find the System.map corresponding to the failing kernel.
  218. .TP
  219. fB-MfR fB--no-system-mapfR
  220. Do not read any System.map.
  221. .P
  222. Default is fB-m fI/usr/src/linux/System.mapfR.
  223. .TP
  224. fB-s fIsave.mapfR fB--save-map=fIsave.mapfR
  225. After ksymoops reads all its sources of symbols, it generates an
  226. internal system map which contains everything from System.map plus a
  227. best attempt to extract all symbols from all the loaded modules.  If
  228. you want to see that consolidated map, specify fB-s fIsave.mapfR to
  229. write it out to fIsave.mapfR.  You do not need to save the map for
  230. normal bug reporting.
  231. .P
  232. Default is no saved map.
  233. .TP
  234. fB-SfR fB--short-linesfR
  235. Some of the ksymoops output lines can be quite long, especially in the
  236. code disassembly, but if you have a wide screen the ksymoops output is
  237. easier to read as long lines.  The fB-SfR toggle switches between
  238. short and long lines.  Note that lines printed by the kernel and
  239. extracted from the Oops.file are not affected by fB-SfR, problem text
  240. is printed as is.
  241. .P
  242. Default is short lines.
  243. .TP
  244. fB-efR fB--endian-swapfR
  245. ksymoops extracts code bytes from the reports and converts them to
  246. instructions.  All kernels print code bytes in hex but unfortunately
  247. some systems print multiple bytes using the native machine endianess.
  248. This only causes a problem if the code is printed in anything other
  249. than 1 byte chunks.  For example, i386 prints one byte at a time which
  250. is machine portable, alpha prints 4 bytes at a time in native endianess
  251. and the report is not machine portable.
  252. If you are doing cross system Oops diagnosis (say for a new system or
  253. an embedded version of Linux), then the failing system and the
  254. reporting system can have different endianess.  On systems that support
  255. little and big endianess at the same time, ksymoops could be compiled
  256. with one endianess but the kernel dump could be using another.  If your
  257. code disassembly is wrong, specify fB-efR.  The fB-efR toggles
  258. between native and reverse endianess when reading the bytes in each
  259. chunk of code.  In this context, a chunk of code is 4 or 8 hex digits
  260. (2 or 4 bytes of code), fB-efR has no effect on code that is printed
  261. as 2 hex digits (one byte at a time).
  262. .ne 4
  263. fBNote:fR Earlier versions of ksymoops used a
  264. fB-c fIcode_bytesfR option.  That is now obsolete, use fB-efR
  265. instead, but only when the code disassembly is incorrect.
  266. .P
  267. The default is to read code bytes using the endianess that ksymoops was
  268. compiled with.
  269. .TP
  270. fB-xfR fB--hexfR
  271. Normally, ksymoops prints offsets and lengths in hex.  If you want
  272. offsets and lengths to be printed in decimal, use the fB-xfR toggle.
  273. .P
  274. Default is hex.
  275. .TP
  276. fB-1fR fB--one-shotfR
  277. Normally, ksymoops reads its entire input file and extracts all Oops
  278. reports.  If the -1 toggle is set, it will run in one shot mode and
  279. exit after the first Oops.  This is useful for automatically mailing
  280. reports as they happen, like this :-
  281. .nf
  282.     #!/bin/sh
  283.     # ksymoops1
  284.     while (true)
  285.     do
  286. ksymoops -1 > $HOME/oops1
  287. if [ $? -eq 3 ]
  288. then
  289.    exit 0  # end of input, no Oops found
  290. fi
  291. mail -s Oops admin < $HOME/oops1
  292.     done
  293.     tail -f /var/log/messages | ksymoops1
  294. .fi
  295. Restarting the tail command after log rotation is left as an exercise
  296. for the reader.
  297. In one shot mode, reading of the various symbol sources is delayed
  298. until ksymoops sees the first program counter, call trace or code line.
  299. This ensures that the current module information is used.  The downside
  300. is that any parameter errors are not detected until an Oops actually
  301. occurs.
  302. .P
  303. The default is to read everything from the Oops.file, extracting and
  304. processing every Oops it finds.  Note that the default method reads the
  305. symbol sources once and assumes that the environment does not change
  306. from one Oops to the next, not necessarily valid when you are using
  307. modules.
  308. .TP
  309. fB-ifR fB--ignore-insmod-pathfR
  310. When you are using an initial ramdisk for modules, the path name to the
  311. modules is typically just /lib.  That pathname is recorded in the
  312. __insmod..._O symbol in ksyms but ksymoops cannot find the files in the
  313. real /lib, so it issues warning messages.  If you specify -i then
  314. ksymoops ignores the path name in __insmod...O symbols, instead it
  315. searchs the -o paths (if any) looking for the object with the correct
  316. basename and timestamp.  -i is recommended when loading modules from a
  317. ramdisk.  This assumes that the -o paths contain the modules used to
  318. build the ramdisk, with the same timestamp.
  319. .P
  320. Default is to use the path from __insmod...O symbols.
  321. .TP
  322. fB-TfR fB--ignore-insmod-allfR
  323. Use this toggle if you want to completely ignore all insmod(8) assistance
  324. information (symbols starting with __insmod in ksyms).  This includes
  325. module paths, timestamps, section start and length etc.  Then ksymoops
  326. will fall back on the old method of matching symbols to module objects,
  327. using the -o paths (if any).  It is hard to think of a legitimate
  328. reason to use -I, -i is better if your only problem is a path name
  329. mismatch.
  330. .P
  331. Default is to use the path from __insmod...O symbols and section
  332. information from __insmod...S symbols.
  333. .TP
  334. fB-T fItruncatefR fB--truncate=fItruncatefR
  335. If your binutils are configured for multiple targets, they tend to
  336. print addresses using the address size of the largest target.  If the
  337. other inputs to ksymoops have shorter symbol sizes, the different
  338. representations cause symbols which should have the same address to
  339. appear at different addresses.  This is a particular problem when
  340. building for mixed 32 and 64 bit targets.  To remove the ambiguity,
  341. use fB--truncate=fItruncatefR.  A value of 0 means no truncation, a
  342. value greater than 8*sizeof(unsigned long) is silently converted to 0.
  343. .P
  344. Default is fB--truncate=fI0fR, no truncation.
  345. .TP
  346. fB-dfR fB--debugfR
  347. Each occurrence of fB-dfR increases the debugging level of ksymoops
  348. by one.
  349. .IP Level 1
  350. Regular expression compile summaries.
  351. Before and after text for *[mns] expansion.
  352. Option processing, but only for options appearing after fB-dfR.
  353. Entry to the main processing routines.
  354. KSYMOOPS_ environment variables.
  355. Object files extracted directly from ksyms.
  356. Information on matches between loaded modules and module objects.
  357. Filename of the Oops report.
  358. Version number for the oops.
  359. Saving merged system map.
  360. .IP Level 2
  361. Summary information on symbol table sizes.
  362. Every version number found in the oops.
  363. Comparing symbol maps.
  364. Appending symbol maps.
  365. Full pathname of a program.
  366. External commands issued.
  367. Progress reports for fB-o fIobjectfR.
  368. The names of '*.o' files found in a fB-ofR directory.
  369. Offset adjustments for module sections.
  370. Every line output from running objdump on the code bytes.
  371. .IP Level 3
  372. Every input line from Oops.file.
  373. Non-duplicate and low address symbols dropped from the merged system map.
  374. Mapping of addresses to symbols.
  375. .IP Level 4
  376. Every input line from all sources, this prints duplicate lines.
  377. The return code from every regexec call.
  378. Ambiguous matches that are ignored.
  379. Every symbol added to every table.
  380. Copying symbol tables.
  381. Increases in symbol table sizes.
  382. Entry to some lower level routines.
  383. Every symbol dropped.
  384. .IP Level 5
  385. For matching regexecs, details on every substring.
  386. .P
  387. Default is no debugging.
  388. .TP
  389. fB-hfR fB--helpfR
  390. Prints the help text and the current defaults.
  391. .TP
  392. fB-t fItargetfR fB--target=fItargetfR
  393. Normally you do Oops diagnosis using the same hardware as the Oops
  394. itself.  But sometimes you need to do cross system Oops diagnosis,
  395. taking an Oops from one type of hardware and processing it on an
  396. another.  For example, when you are porting to a new system or you are
  397. building an embedded kernel.  To do cross system Oops processing, you
  398. must tell ksymoops what the target hardware is, using
  399. fB-t fItargetfR, where fItargetfR is a bfd target name.  You can
  400. find out which targets your machine supports by
  401.   ksymoops -t '?'
  402. .P
  403. Default is the same target as ksymoops itself, with one exception.  On
  404. sparc64, the kernel uses elf64-sparc but user programs are elf32-sparc.
  405. If fB-t fItargetfR was not specified and ksymoops was compiled for
  406. elf32-sparc and the Oops contains a TPC line then ksymoops
  407. automatically switches to -t elf64-sparc.
  408. .TP
  409. fB-a fIarchitecturefR fB--architecture=fIarchitecturefR
  410. To do cross system Oops processing, you must tell ksymoops what the
  411. target architecture is, using fB-a fIarchitecturefR, where
  412. fIarchitecturefR is a bfd architecture name.  You can find out which
  413. architectures your machine supports by
  414.   ksymoops -a '?'
  415. .P
  416. Default is the same architecture as ksymoops itself, with one
  417. exception.  On sparc64, the kernel uses sparc:v9a but user programs are
  418. sparc.  If fB-a fIarchitecturefR was not specified and ksymoops was
  419. compiled for sparc and the Oops contains a TPC line then ksymoops
  420. automatically switches to -a sparcv:9a.
  421. .TP
  422. fB-A fI"address list"fR fB--addresses=fI"address list"fR If you
  423. have a few adhoc addresses to convert to symbols, you can specify them
  424. explicitly using fB-A fI"address list"fR.  Any words in the list
  425. that appear to be addresses are converted to symbols.  Punctuation
  426. characters and non-address words are silently ignored, leading 0x on
  427. addresses is also ignored, so you can paste text including words and
  428. only the addresses will be processed.
  429. .TP
  430. fBOops.file ...fR
  431. ksymoops accepts zero or more input files and reads them all.  If no
  432. files are specified on the command line and no addresses are supplied
  433. via fB-AfR then ksymoops reads from standard input.  You can even
  434. type the Oops text directly at the terminal, although that is not
  435. recommended.
  436. .SH INPUT
  437. .P
  438. ksymoops reads the input file(s), using regular expressions to select
  439. lines that are to be printed and further analyzed.  You do not need to
  440. extract the Oops report by hand.
  441. .P
  442. All tabs are converted to spaces, assuming tabstop=8.  Where the text
  443. below says "at least one space", tabs work just as well but are
  444. converted to spaces before printing.  All nulls and carriage returns
  445. are silently removed from input lines, both cause problems for string
  446. handling and printing.
  447. .P
  448. An input line can have a prefix which ksymoops will print as part of
  449. the line but ignore during analysis.  A prefix can be from syslogd(8)
  450. (consisting of date, time, hostname, 'kernel:'), from syslog-ng
  451. (numbers and three other strings separated by '|'), it can be
  452. '<fInfR>' from /proc/kmsg or the prefix can just be leading spaces.
  453. "start of line" means the first character after skipping all prefixes,
  454. including all leading space.
  455. .P
  456. Every kernel architecture team uses different messages for kernel
  457. problems, see Oops_read in oops.c for the full, gory list.  If you are
  458. entering an Oops by hand, you need to follow the kernel format as much
  459. as possible, otherwise ksymoops may not recognize your input.  Input is
  460. not case sensitive.
  461. .ne 3
  462. A bracketed address is optional '[', required '<', at least 4 hex
  463. digits, required '>', optional ']', optional spaces.  For example
  464. [<01234567>] or <beaf>.
  465. An unbracketed address is at least 4 hex digits, followed by optional
  466. spaces.  For example 01234567 or abCDeF.
  467. The sparc PC line is 'PSR:' at start of line, space, hex digits, space,
  468. 'PC:', space, unbracketed address.
  469. The sparc64 TPC line is 'TSTATE:' at start of line, space, 16 hex
  470. digits, space 'TPC:', space, unbracketed address.
  471. The ppc NIP line has several formats.  'kernel pc' 'trap at PC:'
  472. 'bad area pc' or 'NIP:'.  Any of those strings followed by a single
  473. space and an unbracketed address is the NIP value.
  474. The mips PC line is 'epc' at start of line, optional space, one or more
  475. ':', optional space, unbracketed address.
  476. The ix86 EIP line is 'EIP:' at start of line, at least one space, any
  477. text, bracketed address.
  478. The x86_64 EIP line is 'RIP:' at start of line, at least one space, any
  479. text, bracketed address.
  480. The m68k PC line is 'PC' at start of line, optional spaces, '=',
  481. optional spaces, bracketed address.
  482. The arm PC line is 'pc' at start of line, optional spaces, ':',
  483. optional spaces, bracketed address.
  484. The IA64 IP line is ' ip', optional space, ':', optional space,
  485. bracketed address.
  486. A mips ra line is 'ra', optional spaces, one or more '=', optional
  487. spaces, unbracketed address.
  488. A sparc register dump line is ('i', '0' or '4', ':', space) or
  489. ('Instruction DUMP:', space) or ('Caller[').
  490. The IA64 b0 line is 'b0', optional space, ':', optional space,
  491. unbracketed address.  This can be repeated for other b registers, e.g.
  492. b6, b7.
  493. Register dumps have a plethora of formats.  Most are of the form 'name:
  494. value' repeated across a line, some architectures use '=' instead of
  495. ':'.  See Oops_regs for the current list of recognised register names.
  496. Besides the Oops_regs list, i370, mips, ppc and s390 have special
  497. register dump formats, typically one register name is printed followed
  498. by multiple values.  ksymoops extracts all register contents, but it only
  499. decodes and prints register values that can be resolved to a kernel symbol.
  500. A set of call trace lines starts with 'Trace:' or 'Call Trace:' or
  501. 'Call Backtrace:' (ppc only) or 'Function entered at' (arm only) or
  502. 'Caller[' (sparc64 only) followed by at least one space.
  503. For 'Trace:' and 'Call Trace:', the rest of the line is bracketed
  504. addresses, they can be continued onto extra lines.  Addresses can not
  505. be split across lines.
  506. For 'Call Backtrace:' (ppc only), the rest of the line is unbracketed
  507. addresses, they can be continued onto extra lines.  Addresses can not
  508. be split across lines.
  509. For 'Function entered at' (arm only), the line contains exactly two
  510. bracketed addresses and is not continued.
  511. For 'Caller[' (sparc64 only), the line contains exactly one unbracketed
  512. address and is not continued.
  513. Spin loop information is indicated by a line starting with 'bh: ',
  514. followed by lines containing reverse bracketed trace back addresses.
  515. For some reason, these addresses are different from every other address
  516. and look like this '<[hex]> <[hex]>' instead of the normal
  517. '[<hex>] [<hex>]'.
  518. The Code line is identified by 'Instruction DUMP' or ('Code' followed
  519. by optional spaces), ':', one or more spaces, followed by at least one
  520. hex value.  The line can contain multiple hex values, each separated by
  521. at least one space.  Each hex value must be 2 to 8 digits and must be a
  522. multiple of 2 digits.
  523. Any of the code values can be enclosed in <..> or (..), the last such
  524. value is assumed to be the failing instruction.  If no value has <..>
  525. or (..) then the first byte is assumed to be the failing instruction.
  526. Special cases where Code: can be followed by text.  'Code: general
  527. protection' or 'Code: <n>'.  Dump the data anyway, the code was
  528. unavailable.
  529. Do you detect a slight note of inconsistency in the above?
  530. .SH ADDRESS TO SYMBOL CONVERSION
  531. .P
  532. Addresses are converted to symbols based on the symbols in vmlinux,
  533. /proc/ksyms, object files for modules and System.map, or as many of
  534. those sources as ksymoops was told to read.  ksymoops uses as many
  535. symbol sources as you can provide, does cross checks between the
  536. various sources to identify any discrepancies and builds a merged map
  537. containing all symbols, including loaded modules where possible.
  538. .P
  539. Symbols which end in _R_xxxxxxxx (8 hex digits) or _R_smp_xxxxxxxx are
  540. symbol versioned, see genksyms(8).  ksymoops strips the _R_... when
  541. building its internal system map.
  542. .P
  543. Module symbols do not appear in vmlinux nor System.map and only
  544. exported symbols from modules appear in /proc/ksyms.  Therefore
  545. ksymoops tries to read module symbols from the object files specified
  546. by fB-ofR.  Without these module symbols, diagnosing a problem in a
  547. module is almost impossible.
  548. .P
  549. There are many problems with module symbols, especially with versions
  550. of insmod(8) up to and including 2.1.121.  Some modules do not export
  551. fIanyfR symbols, there is no sign of them in /proc/ksyms so they are
  552. effectively invisible.  Even when a module exports symbols, it
  553. typically only exports one or two, not the complete list that is really
  554. needed for Oops diagnosis.  ksymoops can build a complete symbol table
  555. from the object module but it has to
  556. .HP 4m
  557. (a) Know that the module is loaded.
  558. .HP 4m
  559. (b) Find the correct object file for that module.
  560. .HP 4m
  561. (c) Convert section and symbol data from the module into kernel
  562. addresses.
  563. .P
  564. If a module exports no symbols then there is no way for ksymoops to
  565. obtain any information about that module.  lsmod says it is loaded but
  566. without symbols, ksymoops cannot find the corresponding object file nor
  567. map offsets to addresses.  Sorry but that is the way it is, if you Oops
  568. in a module that displays no symbols in ksyms, forget it :(.
  569. .P
  570. When a module exports symbols, the next step is to find the object file
  571. for that module.  In most cases the loaded module and the object file
  572. has the same basename but that is not guaranteed.  For example,
  573.   insmod uart401 -o xyz
  574. .br
  575. will load uart401.o from your module directories but store it as xyz.
  576. Both ksyms and lsmod say module name 'xyz' with no indication that the
  577. original object file was uart401.  So ksymoops cannot just use the
  578. module name from ksyms or lsmod, it has to do a lot more work to find
  579. the correct object.  It does this by looking for a unique match between
  580. exported symbols and symbols in the module objects.
  581. .P
  582. For every file obtained from the fB-ofR option(s), ksymoops extracts
  583. all symbols (both static and external), using nm(1).  It then runs the
  584. exported module symbols in ksyms and, for every exported module symbol,
  585. it does a string compare of that symbol against every symbol in every
  586. object.  When ksymoops finds a module symbol that is exported in ksyms
  587. and appears exactly fBoncefR amongst all the fB-ofR objects then it
  588. has to assume that the object is the one used to load the module.  If
  589. ksymoops cannot find any match for any exported symbol in a module or
  590. finds more than one match for every exported symbol in a module then it
  591. cannot determine which object was actually loaded.
  592. .P
  593. After ksymoops has matched a loaded module against an object using a
  594. unique symbol, it still has to calculate addresses for the symbols from
  595. the object.  To do this, ksymoops first needs the start address of the
  596. text, data and read only data sections in the loaded module.  Given the
  597. start address of a section, ksymoops can calculate the kernel address
  598. of every symbol in that section and add the symbols to the combined
  599. system map, this includes symbols that are not exported.  Unfortunately
  600. the start address of a section is only available if the module exports
  601. at least one symbol from that section.  For example, if a module only
  602. exports text symbols (the most common case) then ksymoops can only
  603. calculate the start of the text section and has to discard symbols from
  604. the data and read only data sections for that module, reducing the
  605. information available for diagnosis.
  606. .P
  607. When multiple symbol sources are available and those symbol sources
  608. contain a kernel version number, ksymoops compares all the version
  609. numbers.  It flags a warning if there is any mismatch.  One of the more
  610. common causes of problems is force loading a module from one kernel
  611. into a different kernel.  Even if it was deliberate, it needs to be
  612. highlighted for diagnosis.
  613. .P
  614. When both ksyms and lsmod are available, the list of modules extracted
  615. from ksyms is compared against the list of modules from lsmod.  Any
  616. difference is flagged as a warning, it typically indicates invisible
  617. modules.  However it can also be caused by a mismatch between ksyms and
  618. lsmod.
  619. .P
  620. When multiple symbol sources are available, ksymoops does cross checks
  621. between them.  Each check is only performed if both symbol sources are
  622. present and non-empty.  Every symbol in the first source should appear
  623. in the second source and should have the same address.  Where there is
  624. any discrepancy, one of the sources takes precedence, the precedence is
  625. somewhat arbitrary.  Some discrepancies are silently ignored because
  626. they are special cases but the vast majority of symbols are expected to
  627. match.
  628. .HP 2m
  629. * Exported module symbols in ksyms are compared against the symbols
  630. in the corresponding object file.  ksyms takes precedence.
  631. .HP 2m
  632. * The kernel (non module) symbols from ksyms are compared against
  633. vmlinux.  vmlinux takes precedence.
  634. .HP 2m
  635. * The symbols from System.map are compared against vmlinux.  vmlinux
  636. takes precedence.
  637. .HP 2m
  638. * The symbols from vmlinux are compared against System.map.  vmlinux
  639. takes precedence.  These two sources are compared in both directions,
  640. they should be identical.
  641. .HP 2m
  642. * The kernel (non module) symbols from ksyms are compared against
  643. System.map.  System.map takes precedence.
  644. .P
  645. After reading and cross checking all the symbol sources, they are
  646. merged into a single system map.  Duplicate symbols, registers (type a)
  647. and static 'gcc2_compiled.' symbols are dropped from the merged map.
  648. Any symbols with an address below 4096 are discarded, these are symbols
  649. like Using_Versions which has an address of 0.
  650. .P
  651. Given all the above processing and deduction, it is obvious that the
  652. merged system map cannot be 100% reliable, which means that conversion
  653. of addresses to symbols cannot be reliable.  The addresses are valid
  654. but the symbol conversion is only as good as the symbol sources you fed
  655. into ksymoops.
  656. .P
  657. /proc/ksyms and /proc/lsmod are volatile so unless ksymoops gets the
  658. current ksyms, you always have to question the validity of the module
  659. information.  The only way I know to (almost) guarantee valid ksyms is
  660. to use ksymoops in one shot mode (see option fI-1fR).  Then ksymoops
  661. reads the log and decodes Oops in real time.
  662. .SH KSYMOOPS SUPPORT IN MODUTILS
  663. .P
  664. Modutils 2.3.1 onwards has support to make oops debugging easier,
  665. especially for modules.  See insmod(8) for details.  If you want
  666. automatic snapshots of ksyms and lsmod data as modules are loaded and
  667. unloaded, create /var/log/ksymoops, it should be owned by root with
  668. mode 644 or 600.  If you do not want automatic snapshots, do not create
  669. the directory.  A script (insmod_ksymoops_clean) is provided by
  670. modutils to delete old versions, this should be run by cron once a day.
  671. .SH OUTPUT
  672. .P
  673. ksymoops prints all lines that contain text which might indicate a
  674. kernel problem.  Due the complete lack of standards in kernel error
  675. messages, I cannot guarantee that all problem lines are printed.  If
  676. you see a line in your logs which ksymoops should extract but does not,
  677. contact the maintainer.
  678. .P
  679. When ksymoops sees EIP/PC/NIP/TPC lines, call trace lines or code
  680. lines, it prints them and stores them for later processing.  When the
  681. code line is detected, ksymoops converts the EIP/PC/NIP/TPC address and
  682. the call trace addresses to symbols.  These lines have ';' after the
  683. header instead of ':', just in case anybody wants to feed ksymoops
  684. output back into ksymoops, these generated lines are ignored.
  685. .P
  686. Formatted data for the program counter, trace and code is only output
  687. when the Code: line is seen.  If any data has been stored for later
  688. formatting and more than 5 lines other than Oops text or end of file
  689. are encountered then ksymoops assumes that the Code: line is missing or
  690. garbled and dumps the formatted data anyway.  That should be fail safe
  691. because the Code: line (or its equivalent) signals the end of the Oops
  692. report.  Except for sparc64 on SMP which has a register dump
  693. fIafterfR the code.  ksymoops tries to cater for this exception.
  694. Sigh.
  695. .P
  696. Addresses are converted to symbols wherever possible.  For example
  697. .nf
  698.   >>EIP; c0113f8c <sys_init_module+49c/4d0>
  699.   Trace; c011d3f5 <sys_mremap+295/370>
  700.   Trace; c011af5f <do_generic_file_read+5bf/5f0>
  701.   Trace; c011afe9 <file_read_actor+59/60>
  702.   Trace; c011d2bc <sys_mremap+15c/370>
  703.   Trace; c010e80f <do_sigaltstack+ff/1a0>
  704.   Trace; c0107c39 <overflow+9/c>
  705.   Trace; c0107b30 <tracesys+1c/23>
  706.   Trace; 00001000 Before first symbol
  707. .fi
  708. .P
  709. Each converted address is followed by the nearest symbol below that
  710. address.  That symbol is followed by the offset of the address from the
  711. symbol.  The value after '/' is the "size" of the symbol, the
  712. difference between the symbol and the next known symbol.  So
  713.   >>EIP; c0113f8c <sys_init_module+49c/4d0>
  714. means that the program counter was c0113f8c.  The previous symbol is
  715. sys_init_module, the address is 0x49c bytes from the start of the
  716. symbol, sys_init_module is 0x4d0 bytes long.  If you prefer decimal
  717. offsets and lengths see option fB-xfR.  If the symbol comes from a
  718. module, it is prefixed by '[fImodule_namefR]', several modules have
  719. the same procedure names.
  720. .P
  721. The use of 'EIP' for program counter above is for ix86.  ksymoops tries
  722. to use the correct acronym for the program counter (PC, NIP, TPC etc.)
  723. but if it does not recognize the target hardware, it defaults to EIP.
  724. .P
  725. When a Code: line is read, ksymoops extracts the code bytes.  It uses
  726. the program counter line together with the code bytes to generate a
  727. small object file in the target architecture.  ksymoops then invokes
  728. objdump(1) to disassemble this object file.  The human readable
  729. instructions are extracted from the objdump output and printed with
  730. address to symbol conversion.  If the disassembled code does not look
  731. sensible, see the fI-efR, fI-afR and fI-tfR options.
  732. .P
  733. fBTAKE ALL SYMBOLS, OFFSETS AND LENGTHS WITH A PINCH OF SALT!fR
  734. The addresses are valid but the symbol conversion is only as good as
  735. the input you gave ksymoops.  See all the problems in "ADDRESS TO SYMBOL
  736. CONVERSION" above.  Also the stack trace is potentially ambiguous.  The
  737. kernel prints any addresses on the stack that fBmightfR be valid
  738. addresses.  The kernel has no way of telling which (if any) of these
  739. addresses are real and which are just lying on the stack from previous
  740. procedures.  ksymoops just decodes what the kernel prints.
  741. .SH ENVIRONMENT VARIABLES
  742. .TP
  743. KSYMOOPS_NM
  744. Path for nm, defaults to ${INSTALL_PREFIX}/bin/${CROSS}nm.
  745. .TP
  746. KSYMOOPS_FIND
  747. Path for find, defaults to /usr/bin/find.
  748. .TP
  749. KSYMOOPS_OBJDUMP
  750. Path for objdump, defaults to ${INSTALL_PREFIX}/bin/${CROSS}objdump.
  751. .SH CROSS SYSTEM OOPS DIAGNOSIS
  752. .P
  753. To process an Oops from one system on another, you need access to all
  754. the symbol sources, including modules, System.map, ksyms etc.  If the
  755. two systems are different hardware, you also need versions of the nm
  756. and objdump commands that run on your system but handle the target
  757. system.  You also need versions of libbfd, libopcodes, and libiberty
  758. that handle the target system.  Consult the binutils documentation
  759. for instructions on how to build cross system versions of these
  760. utilities.
  761. .P
  762. To override the default versions of nm and find, use the environment
  763. variables above.  To use different versions of libbfd and libiberty,
  764. use the --rpath option when linking ksymoops or the LD_LIBRARY_PATH
  765. environment variable when running ksymoops.  See the info pages for ld
  766. and /usr/doc/glibc*/FAQ.
  767. You can also build a version of ksymoops that is dedicated to the cross
  768. compile environment by using the BFD_PREFIX, DEF_TARGET, DEF_ARCH and
  769. CROSS options at build time.
  770. See INSTALL in the ksymoops source package for more details.
  771. .SH DIAGNOSTICS
  772. .HP 4m
  773. 0 - normal.
  774. .HP 4m
  775. 1 - error(s) or warning(s) issued, results may not be reliable.
  776. .HP 4m
  777. 2 - fatal error, no useful results.
  778. .HP 4m
  779. 3 - One shot mode, end of input was reached without seeing an Oops.
  780. .SH BUGS
  781. Because of the plethora of possible kernel error and information
  782. strings, ksymoops's pattern matching sometimes prints lines that are
  783. not errors at all.  For example, a line starting with 3c589 matches the
  784. pattern for a call trace line, both start with at least 4 hex digits.
  785. Humans are smarter than programs, ignore spurious lines.
  786. .SH AUTHORS
  787. Keith Owens <kaos@ocs.com.au> - maintainer.
  788. Patches from Jakub Jelinek <jj@sunsite.mff.cuni.cz>, Richard Henderson
  789. <rth@twiddle.net>.
  790. .SH HISTORY
  791. The original ksymoops.cc was written by Greg McGary
  792. <gkm@magilla.cichlid.com> and updated by Andreas Schwab
  793. <schwab@issan.informatik.uni-dortmund.de>.  That version required C++
  794. and supported only ix86 and m68k.
  795. .P
  796. To get the equivalent of the old ksymoops.cc (no vmlinux, no modules,
  797. no ksyms, no System.map) use ksymoops -VKLOM.  Or to just read
  798. System.map, ksymoops -VKLO -m mapfile.
  799. .SH SEE ALSO
  800. .P
  801. find(1),  insmod(8), nm(1), objdump(1), rmmod(8), dmesg(8),
  802. genksyms(8), syslogd(8).  bfd info files.