bug-hunting.rst 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. Bug hunting
  2. ===========
  3. Kernel bug reports often come with a stack dump like the one below::
  4. ------------[ cut here ]------------
  5. WARNING: CPU: 1 PID: 28102 at kernel/module.c:1108 module_put+0x57/0x70
  6. Modules linked in: dvb_usb_gp8psk(-) dvb_usb dvb_core nvidia_drm(PO) nvidia_modeset(PO) snd_hda_codec_hdmi snd_hda_intel snd_hda_codec snd_hwdep snd_hda_core snd_pcm snd_timer snd soundcore nvidia(PO) [last unloaded: rc_core]
  7. CPU: 1 PID: 28102 Comm: rmmod Tainted: P WC O 4.8.4-build.1 #1
  8. Hardware name: MSI MS-7309/MS-7309, BIOS V1.12 02/23/2009
  9. 00000000 c12ba080 00000000 00000000 c103ed6a c1616014 00000001 00006dc6
  10. c1615862 00000454 c109e8a7 c109e8a7 00000009 ffffffff 00000000 f13f6a10
  11. f5f5a600 c103ee33 00000009 00000000 00000000 c109e8a7 f80ca4d0 c109f617
  12. Call Trace:
  13. [<c12ba080>] ? dump_stack+0x44/0x64
  14. [<c103ed6a>] ? __warn+0xfa/0x120
  15. [<c109e8a7>] ? module_put+0x57/0x70
  16. [<c109e8a7>] ? module_put+0x57/0x70
  17. [<c103ee33>] ? warn_slowpath_null+0x23/0x30
  18. [<c109e8a7>] ? module_put+0x57/0x70
  19. [<f80ca4d0>] ? gp8psk_fe_set_frontend+0x460/0x460 [dvb_usb_gp8psk]
  20. [<c109f617>] ? symbol_put_addr+0x27/0x50
  21. [<f80bc9ca>] ? dvb_usb_adapter_frontend_exit+0x3a/0x70 [dvb_usb]
  22. [<f80bb3bf>] ? dvb_usb_exit+0x2f/0xd0 [dvb_usb]
  23. [<c13d03bc>] ? usb_disable_endpoint+0x7c/0xb0
  24. [<f80bb48a>] ? dvb_usb_device_exit+0x2a/0x50 [dvb_usb]
  25. [<c13d2882>] ? usb_unbind_interface+0x62/0x250
  26. [<c136b514>] ? __pm_runtime_idle+0x44/0x70
  27. [<c13620d8>] ? __device_release_driver+0x78/0x120
  28. [<c1362907>] ? driver_detach+0x87/0x90
  29. [<c1361c48>] ? bus_remove_driver+0x38/0x90
  30. [<c13d1c18>] ? usb_deregister+0x58/0xb0
  31. [<c109fbb0>] ? SyS_delete_module+0x130/0x1f0
  32. [<c1055654>] ? task_work_run+0x64/0x80
  33. [<c1000fa5>] ? exit_to_usermode_loop+0x85/0x90
  34. [<c10013f0>] ? do_fast_syscall_32+0x80/0x130
  35. [<c1549f43>] ? sysenter_past_esp+0x40/0x6a
  36. ---[ end trace 6ebc60ef3981792f ]---
  37. Such stack traces provide enough information to identify the line inside the
  38. Kernel's source code where the bug happened. Depending on the severity of
  39. the issue, it may also contain the word **Oops**, as on this one::
  40. BUG: unable to handle kernel NULL pointer dereference at (null)
  41. IP: [<c06969d4>] iret_exc+0x7d0/0xa59
  42. *pdpt = 000000002258a001 *pde = 0000000000000000
  43. Oops: 0002 [#1] PREEMPT SMP
  44. ...
  45. Despite being an **Oops** or some other sort of stack trace, the offended
  46. line is usually required to identify and handle the bug. Along this chapter,
  47. we'll refer to "Oops" for all kinds of stack traces that need to be analyzed.
  48. If the kernel is compiled with ``CONFIG_DEBUG_INFO``, you can enhance the
  49. quality of the stack trace by using file:`scripts/decode_stacktrace.sh`.
  50. Modules linked in
  51. -----------------
  52. Modules that are tainted or are being loaded or unloaded are marked with
  53. "(...)", where the taint flags are described in
  54. file:`Documentation/admin-guide/tainted-kernels.rst`, "being loaded" is
  55. annotated with "+", and "being unloaded" is annotated with "-".
  56. Where is the Oops message is located?
  57. -------------------------------------
  58. Normally the Oops text is read from the kernel buffers by klogd and
  59. handed to ``syslogd`` which writes it to a syslog file, typically
  60. ``/var/log/messages`` (depends on ``/etc/syslog.conf``). On systems with
  61. systemd, it may also be stored by the ``journald`` daemon, and accessed
  62. by running ``journalctl`` command.
  63. Sometimes ``klogd`` dies, in which case you can run ``dmesg > file`` to
  64. read the data from the kernel buffers and save it. Or you can
  65. ``cat /proc/kmsg > file``, however you have to break in to stop the transfer,
  66. since ``kmsg`` is a "never ending file".
  67. If the machine has crashed so badly that you cannot enter commands or
  68. the disk is not available then you have three options:
  69. (1) Hand copy the text from the screen and type it in after the machine
  70. has restarted. Messy but it is the only option if you have not
  71. planned for a crash. Alternatively, you can take a picture of
  72. the screen with a digital camera - not nice, but better than
  73. nothing. If the messages scroll off the top of the console, you
  74. may find that booting with a higher resolution (e.g., ``vga=791``)
  75. will allow you to read more of the text. (Caveat: This needs ``vesafb``,
  76. so won't help for 'early' oopses.)
  77. (2) Boot with a serial console (see
  78. :ref:`Documentation/admin-guide/serial-console.rst <serial_console>`),
  79. run a null modem to a second machine and capture the output there
  80. using your favourite communication program. Minicom works well.
  81. (3) Use Kdump (see Documentation/admin-guide/kdump/kdump.rst),
  82. extract the kernel ring buffer from old memory with using dmesg
  83. gdbmacro in Documentation/admin-guide/kdump/gdbmacros.txt.
  84. Finding the bug's location
  85. --------------------------
  86. Reporting a bug works best if you point the location of the bug at the
  87. Kernel source file. There are two methods for doing that. Usually, using
  88. ``gdb`` is easier, but the Kernel should be pre-compiled with debug info.
  89. gdb
  90. ^^^
  91. The GNU debugger (``gdb``) is the best way to figure out the exact file and line
  92. number of the OOPS from the ``vmlinux`` file.
  93. The usage of gdb works best on a kernel compiled with ``CONFIG_DEBUG_INFO``.
  94. This can be set by running::
  95. $ ./scripts/config -d COMPILE_TEST -e DEBUG_KERNEL -e DEBUG_INFO
  96. On a kernel compiled with ``CONFIG_DEBUG_INFO``, you can simply copy the
  97. EIP value from the OOPS::
  98. EIP: 0060:[<c021e50e>] Not tainted VLI
  99. And use GDB to translate that to human-readable form::
  100. $ gdb vmlinux
  101. (gdb) l *0xc021e50e
  102. If you don't have ``CONFIG_DEBUG_INFO`` enabled, you use the function
  103. offset from the OOPS::
  104. EIP is at vt_ioctl+0xda8/0x1482
  105. And recompile the kernel with ``CONFIG_DEBUG_INFO`` enabled::
  106. $ ./scripts/config -d COMPILE_TEST -e DEBUG_KERNEL -e DEBUG_INFO
  107. $ make vmlinux
  108. $ gdb vmlinux
  109. (gdb) l *vt_ioctl+0xda8
  110. 0x1888 is in vt_ioctl (drivers/tty/vt/vt_ioctl.c:293).
  111. 288 {
  112. 289 struct vc_data *vc = NULL;
  113. 290 int ret = 0;
  114. 291
  115. 292 console_lock();
  116. 293 if (VT_BUSY(vc_num))
  117. 294 ret = -EBUSY;
  118. 295 else if (vc_num)
  119. 296 vc = vc_deallocate(vc_num);
  120. 297 console_unlock();
  121. or, if you want to be more verbose::
  122. (gdb) p vt_ioctl
  123. $1 = {int (struct tty_struct *, unsigned int, unsigned long)} 0xae0 <vt_ioctl>
  124. (gdb) l *0xae0+0xda8
  125. You could, instead, use the object file::
  126. $ make drivers/tty/
  127. $ gdb drivers/tty/vt/vt_ioctl.o
  128. (gdb) l *vt_ioctl+0xda8
  129. If you have a call trace, such as::
  130. Call Trace:
  131. [<ffffffff8802c8e9>] :jbd:log_wait_commit+0xa3/0xf5
  132. [<ffffffff810482d9>] autoremove_wake_function+0x0/0x2e
  133. [<ffffffff8802770b>] :jbd:journal_stop+0x1be/0x1ee
  134. ...
  135. this shows the problem likely is in the :jbd: module. You can load that module
  136. in gdb and list the relevant code::
  137. $ gdb fs/jbd/jbd.ko
  138. (gdb) l *log_wait_commit+0xa3
  139. .. note::
  140. You can also do the same for any function call at the stack trace,
  141. like this one::
  142. [<f80bc9ca>] ? dvb_usb_adapter_frontend_exit+0x3a/0x70 [dvb_usb]
  143. The position where the above call happened can be seen with::
  144. $ gdb drivers/media/usb/dvb-usb/dvb-usb.o
  145. (gdb) l *dvb_usb_adapter_frontend_exit+0x3a
  146. objdump
  147. ^^^^^^^
  148. To debug a kernel, use objdump and look for the hex offset from the crash
  149. output to find the valid line of code/assembler. Without debug symbols, you
  150. will see the assembler code for the routine shown, but if your kernel has
  151. debug symbols the C code will also be available. (Debug symbols can be enabled
  152. in the kernel hacking menu of the menu configuration.) For example::
  153. $ objdump -r -S -l --disassemble net/dccp/ipv4.o
  154. .. note::
  155. You need to be at the top level of the kernel tree for this to pick up
  156. your C files.
  157. If you don't have access to the source code you can still debug some crash
  158. dumps using the following method (example crash dump output as shown by
  159. Dave Miller)::
  160. EIP is at +0x14/0x4c0
  161. ...
  162. Code: 44 24 04 e8 6f 05 00 00 e9 e8 fe ff ff 8d 76 00 8d bc 27 00 00
  163. 00 00 55 57 56 53 81 ec bc 00 00 00 8b ac 24 d0 00 00 00 8b 5d 08
  164. <8b> 83 3c 01 00 00 89 44 24 14 8b 45 28 85 c0 89 44 24 18 0f 85
  165. Put the bytes into a "foo.s" file like this:
  166. .text
  167. .globl foo
  168. foo:
  169. .byte .... /* bytes from Code: part of OOPS dump */
  170. Compile it with "gcc -c -o foo.o foo.s" then look at the output of
  171. "objdump --disassemble foo.o".
  172. Output:
  173. ip_queue_xmit:
  174. push %ebp
  175. push %edi
  176. push %esi
  177. push %ebx
  178. sub $0xbc, %esp
  179. mov 0xd0(%esp), %ebp ! %ebp = arg0 (skb)
  180. mov 0x8(%ebp), %ebx ! %ebx = skb->sk
  181. mov 0x13c(%ebx), %eax ! %eax = inet_sk(sk)->opt
  182. file:`scripts/decodecode` can be used to automate most of this, depending
  183. on what CPU architecture is being debugged.
  184. Reporting the bug
  185. -----------------
  186. Once you find where the bug happened, by inspecting its location,
  187. you could either try to fix it yourself or report it upstream.
  188. In order to report it upstream, you should identify the bug tracker, if any, or
  189. mailing list used for the development of the affected code. This can be done by
  190. using the ``get_maintainer.pl`` script.
  191. For example, if you find a bug at the gspca's sonixj.c file, you can get
  192. its maintainers with::
  193. $ ./scripts/get_maintainer.pl --bug -f drivers/media/usb/gspca/sonixj.c
  194. Hans Verkuil <hverkuil@xs4all.nl> (odd fixer:GSPCA USB WEBCAM DRIVER,commit_signer:1/1=100%)
  195. Mauro Carvalho Chehab <mchehab@kernel.org> (maintainer:MEDIA INPUT INFRASTRUCTURE (V4L/DVB),commit_signer:1/1=100%)
  196. Tejun Heo <tj@kernel.org> (commit_signer:1/1=100%)
  197. Bhaktipriya Shridhar <bhaktipriya96@gmail.com> (commit_signer:1/1=100%,authored:1/1=100%,added_lines:4/4=100%,removed_lines:9/9=100%)
  198. linux-media@vger.kernel.org (open list:GSPCA USB WEBCAM DRIVER)
  199. linux-kernel@vger.kernel.org (open list)
  200. Please notice that it will point to:
  201. - The last developers that touched the source code (if this is done inside
  202. a git tree). On the above example, Tejun and Bhaktipriya (in this
  203. specific case, none really involved on the development of this file);
  204. - The driver maintainer (Hans Verkuil);
  205. - The subsystem maintainer (Mauro Carvalho Chehab);
  206. - The driver and/or subsystem mailing list (linux-media@vger.kernel.org);
  207. - The Linux Kernel mailing list (linux-kernel@vger.kernel.org);
  208. - The bug reporting URIs for the driver/subsystem (none in the above example).
  209. If the listing contains bug reporting URIs at the end, please prefer them over
  210. email. Otherwise, please report bugs to the mailing list used for the
  211. development of the code (linux-media ML) copying the driver maintainer (Hans).
  212. If you are totally stumped as to whom to send the report, and
  213. ``get_maintainer.pl`` didn't provide you anything useful, send it to
  214. linux-kernel@vger.kernel.org.
  215. Thanks for your help in making Linux as stable as humanly possible.
  216. Fixing the bug
  217. --------------
  218. If you know programming, you could help us by not only reporting the bug,
  219. but also providing us with a solution. After all, open source is about
  220. sharing what you do and don't you want to be recognised for your genius?
  221. If you decide to take this way, once you have worked out a fix please submit
  222. it upstream.
  223. Please do read
  224. :ref:`Documentation/process/submitting-patches.rst <submittingpatches>` though
  225. to help your code get accepted.
  226. ---------------------------------------------------------------------------
  227. Notes on Oops tracing with ``klogd``
  228. ------------------------------------
  229. In order to help Linus and the other kernel developers there has been
  230. substantial support incorporated into ``klogd`` for processing protection
  231. faults. In order to have full support for address resolution at least
  232. version 1.3-pl3 of the ``sysklogd`` package should be used.
  233. When a protection fault occurs the ``klogd`` daemon automatically
  234. translates important addresses in the kernel log messages to their
  235. symbolic equivalents. This translated kernel message is then
  236. forwarded through whatever reporting mechanism ``klogd`` is using. The
  237. protection fault message can be simply cut out of the message files
  238. and forwarded to the kernel developers.
  239. Two types of address resolution are performed by ``klogd``. The first is
  240. static translation and the second is dynamic translation.
  241. Static translation uses the System.map file.
  242. In order to do static translation the ``klogd`` daemon
  243. must be able to find a system map file at daemon initialization time.
  244. See the klogd man page for information on how ``klogd`` searches for map
  245. files.
  246. Dynamic address translation is important when kernel loadable modules
  247. are being used. Since memory for kernel modules is allocated from the
  248. kernel's dynamic memory pools there are no fixed locations for either
  249. the start of the module or for functions and symbols in the module.
  250. The kernel supports system calls which allow a program to determine
  251. which modules are loaded and their location in memory. Using these
  252. system calls the klogd daemon builds a symbol table which can be used
  253. to debug a protection fault which occurs in a loadable kernel module.
  254. At the very minimum klogd will provide the name of the module which
  255. generated the protection fault. There may be additional symbolic
  256. information available if the developer of the loadable module chose to
  257. export symbol information from the module.
  258. Since the kernel module environment can be dynamic there must be a
  259. mechanism for notifying the ``klogd`` daemon when a change in module
  260. environment occurs. There are command line options available which
  261. allow klogd to signal the currently executing daemon that symbol
  262. information should be refreshed. See the ``klogd`` manual page for more
  263. information.
  264. A patch is included with the sysklogd distribution which modifies the
  265. ``modules-2.0.0`` package to automatically signal klogd whenever a module
  266. is loaded or unloaded. Applying this patch provides essentially
  267. seamless support for debugging protection faults which occur with
  268. kernel loadable modules.
  269. The following is an example of a protection fault in a loadable module
  270. processed by ``klogd``::
  271. Aug 29 09:51:01 blizard kernel: Unable to handle kernel paging request at virtual address f15e97cc
  272. Aug 29 09:51:01 blizard kernel: current->tss.cr3 = 0062d000, %cr3 = 0062d000
  273. Aug 29 09:51:01 blizard kernel: *pde = 00000000
  274. Aug 29 09:51:01 blizard kernel: Oops: 0002
  275. Aug 29 09:51:01 blizard kernel: CPU: 0
  276. Aug 29 09:51:01 blizard kernel: EIP: 0010:[oops:_oops+16/3868]
  277. Aug 29 09:51:01 blizard kernel: EFLAGS: 00010212
  278. Aug 29 09:51:01 blizard kernel: eax: 315e97cc ebx: 003a6f80 ecx: 001be77b edx: 00237c0c
  279. Aug 29 09:51:01 blizard kernel: esi: 00000000 edi: bffffdb3 ebp: 00589f90 esp: 00589f8c
  280. Aug 29 09:51:01 blizard kernel: ds: 0018 es: 0018 fs: 002b gs: 002b ss: 0018
  281. Aug 29 09:51:01 blizard kernel: Process oops_test (pid: 3374, process nr: 21, stackpage=00589000)
  282. Aug 29 09:51:01 blizard kernel: Stack: 315e97cc 00589f98 0100b0b4 bffffed4 0012e38e 00240c64 003a6f80 00000001
  283. Aug 29 09:51:01 blizard kernel: 00000000 00237810 bfffff00 0010a7fa 00000003 00000001 00000000 bfffff00
  284. Aug 29 09:51:01 blizard kernel: bffffdb3 bffffed4 ffffffda 0000002b 0007002b 0000002b 0000002b 00000036
  285. Aug 29 09:51:01 blizard kernel: Call Trace: [oops:_oops_ioctl+48/80] [_sys_ioctl+254/272] [_system_call+82/128]
  286. Aug 29 09:51:01 blizard kernel: Code: c7 00 05 00 00 00 eb 08 90 90 90 90 90 90 90 90 89 ec 5d c3
  287. ---------------------------------------------------------------------------
  288. ::
  289. Dr. G.W. Wettstein Oncology Research Div. Computing Facility
  290. Roger Maris Cancer Center INTERNET: greg@wind.rmcc.com
  291. 820 4th St. N.
  292. Fargo, ND 58122
  293. Phone: 701-234-7556