sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/admin-guide/bug-huntingmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/zh_TW/admin-guide/bug-huntingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/it_IT/admin-guide/bug-huntingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/ja_JP/admin-guide/bug-huntingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/ko_KR/admin-guide/bug-huntingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/sp_SP/admin-guide/bug-huntingmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Simplified)uh1h hh _documenthsourceNlineNubhnote)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]h paragraph)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh5Documentation/translations/zh_CN/disclaimer-zh_CN.rsthKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhX/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/admin-guide/bug-hunting.rsthKubh field_body)}(h(:doc:`../../../admin-guide/bug-hunting` h]h)}(h':doc:`../../../admin-guide/bug-hunting`h]h)}(hhh]hinline)}(hhh]h ../../../admin-guide/bug-hunting}(hhhhhNhNubah}(h]h ](xrefstdstd-doceh"]h$]h&]uh1hhhubah}(h]h ]h"]h$]h&]refdoc*translations/zh_CN/admin-guide/bug-hunting refdomainhreftypedoc refexplicitrefwarn reftarget ../../../admin-guide/bug-huntinguh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h译者h]h译者}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhKubh)}(h*吴想成 Wu XiangCheng h]h)}(h)吴想成 Wu XiangCheng h](h吴想成 Wu XiangCheng <}(hj.hhhNhNubh reference)}(hbobwxc@email.cnh]hbobwxc@email.cn}(hj8hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:bobwxc@email.cnuh1j6hj.ubh>}(hj.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj*ubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhsection)}(hhh](htitle)}(h 追踪缺陷h]h 追踪缺陷}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jihjfhhhhhK ubh)}(h2内核错误报告通常附带如下堆栈转储::h]h1内核错误报告通常附带如下堆栈转储:}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hjfhhubh literal_block)}(hX------------[ cut here ]------------ WARNING: CPU: 1 PID: 28102 at kernel/module.c:1108 module_put+0x57/0x70 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] CPU: 1 PID: 28102 Comm: rmmod Tainted: P WC O 4.8.4-build.1 #1 Hardware name: MSI MS-7309/MS-7309, BIOS V1.12 02/23/2009 00000000 c12ba080 00000000 00000000 c103ed6a c1616014 00000001 00006dc6 c1615862 00000454 c109e8a7 c109e8a7 00000009 ffffffff 00000000 f13f6a10 f5f5a600 c103ee33 00000009 00000000 00000000 c109e8a7 f80ca4d0 c109f617 Call Trace: [] ? dump_stack+0x44/0x64 [] ? __warn+0xfa/0x120 [] ? module_put+0x57/0x70 [] ? module_put+0x57/0x70 [] ? warn_slowpath_null+0x23/0x30 [] ? module_put+0x57/0x70 [] ? gp8psk_fe_set_frontend+0x460/0x460 [dvb_usb_gp8psk] [] ? symbol_put_addr+0x27/0x50 [] ? dvb_usb_adapter_frontend_exit+0x3a/0x70 [dvb_usb] [] ? dvb_usb_exit+0x2f/0xd0 [dvb_usb] [] ? usb_disable_endpoint+0x7c/0xb0 [] ? dvb_usb_device_exit+0x2a/0x50 [dvb_usb] [] ? usb_unbind_interface+0x62/0x250 [] ? __pm_runtime_idle+0x44/0x70 [] ? __device_release_driver+0x78/0x120 [] ? driver_detach+0x87/0x90 [] ? bus_remove_driver+0x38/0x90 [] ? usb_deregister+0x58/0xb0 [] ? SyS_delete_module+0x130/0x1f0 [] ? task_work_run+0x64/0x80 [] ? exit_to_usermode_loop+0x85/0x90 [] ? do_fast_syscall_32+0x80/0x130 [] ? sysenter_past_esp+0x40/0x6a ---[ end trace 6ebc60ef3981792f ]---h]hX------------[ cut here ]------------ WARNING: CPU: 1 PID: 28102 at kernel/module.c:1108 module_put+0x57/0x70 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] CPU: 1 PID: 28102 Comm: rmmod Tainted: P WC O 4.8.4-build.1 #1 Hardware name: MSI MS-7309/MS-7309, BIOS V1.12 02/23/2009 00000000 c12ba080 00000000 00000000 c103ed6a c1616014 00000001 00006dc6 c1615862 00000454 c109e8a7 c109e8a7 00000009 ffffffff 00000000 f13f6a10 f5f5a600 c103ee33 00000009 00000000 00000000 c109e8a7 f80ca4d0 c109f617 Call Trace: [] ? dump_stack+0x44/0x64 [] ? __warn+0xfa/0x120 [] ? module_put+0x57/0x70 [] ? module_put+0x57/0x70 [] ? warn_slowpath_null+0x23/0x30 [] ? module_put+0x57/0x70 [] ? gp8psk_fe_set_frontend+0x460/0x460 [dvb_usb_gp8psk] [] ? symbol_put_addr+0x27/0x50 [] ? dvb_usb_adapter_frontend_exit+0x3a/0x70 [dvb_usb] [] ? dvb_usb_exit+0x2f/0xd0 [dvb_usb] [] ? usb_disable_endpoint+0x7c/0xb0 [] ? dvb_usb_device_exit+0x2a/0x50 [dvb_usb] [] ? usb_unbind_interface+0x62/0x250 [] ? __pm_runtime_idle+0x44/0x70 [] ? __device_release_driver+0x78/0x120 [] ? driver_detach+0x87/0x90 [] ? bus_remove_driver+0x38/0x90 [] ? usb_deregister+0x58/0xb0 [] ? SyS_delete_module+0x130/0x1f0 [] ? task_work_run+0x64/0x80 [] ? exit_to_usermode_loop+0x85/0x90 [] ? do_fast_syscall_32+0x80/0x130 [] ? sysenter_past_esp+0x40/0x6a ---[ end trace 6ebc60ef3981792f ]---}hjsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1jhhhKhjfhhubh)}(h这样的堆栈跟踪提供了足够的信息来识别内核源代码中发生错误的那一行。根据问题的 严重性,它还可能包含 **“Oops”** 一词,比如::h](h这样的堆栈跟踪提供了足够的信息来识别内核源代码中发生错误的那一行。根据问题的 严重性,它还可能包含 }(hjhhhNhNubhstrong)}(h**“Oops”**h]h “Oops”}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 一词,比如:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK0hjfhhubj)}(hBUG: unable to handle kernel NULL pointer dereference at (null) IP: [] iret_exc+0x7d0/0xa59 *pdpt = 000000002258a001 *pde = 0000000000000000 Oops: 0002 [#1] PREEMPT SMP ...h]hBUG: unable to handle kernel NULL pointer dereference at (null) IP: [] iret_exc+0x7d0/0xa59 *pdpt = 000000002258a001 *pde = 0000000000000000 Oops: 0002 [#1] PREEMPT SMP ...}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhK3hjfhhubh)}(h尽管有 **Oops** 或其他类型的堆栈跟踪,但通常需要找到出问题的行来识别和处理缺 陷。在本章中,我们将参考“Oops”来了解需要分析的各种堆栈跟踪。h](h 尽管有 }(hjhhhNhNubj)}(h**Oops**h]hOops}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 或其他类型的堆栈跟踪,但通常需要找到出问题的行来识别和处理缺 陷。在本章中,我们将参考“Oops”来了解需要分析的各种堆栈跟踪。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK9hjfhhubh)}(hs如果内核是用 ``CONFIG_DEBUG_INFO`` 编译的,那么可以使用文件: `scripts/decode_stacktrace.sh` 。h](h如果内核是用 }(hjhhhNhNubhliteral)}(h``CONFIG_DEBUG_INFO``h]hCONFIG_DEBUG_INFO}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) 编译的,那么可以使用文件: }(hjhhhNhNubhtitle_reference)}(h`scripts/decode_stacktrace.sh`h]hscripts/decode_stacktrace.sh}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK file`` 从内核缓冲区 读取数据并保存它。或者您可以 ``cat /proc/kmsg > file`` ,但是您必须适时 中断以停止传输,因为 ``kmsg`` 是一个“永无止境的文件”。h](h有时 }(hjhhhNhNubj)}(h ``klogd``h]hklogd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, 会挂掉,这种情况下您可以运行 }(hjhhhNhNubj)}(h``dmesg > file``h]h dmesg > file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh? 从内核缓冲区 读取数据并保存它。或者您可以 }(hjhhhNhNubj)}(h``cat /proc/kmsg > file``h]hcat /proc/kmsg > file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh9 ,但是您必须适时 中断以停止传输,因为 }(hjhhhNhNubj)}(h``kmsg``h]hkmsg}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh( 是一个“永无止境的文件”。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKOhjXhhubh)}(hZ如果机器严重崩溃,无法输入命令或磁盘不可用,那还有三个选项:h]hZ如果机器严重崩溃,无法输入命令或磁盘不可用,那还有三个选项:}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKShjXhhubhenumerated_list)}(hhh](h list_item)}(hX手动复制屏幕上的文本,并在机器重新启动后输入。很难受,但这是突然崩溃下 唯一的选择。或者你可以用数码相机拍下屏幕——虽然不那么好,但总比什么都没 有好。如果消息滚动超出控制台顶部,使用更高分辨率(例如 ``vga=791`` ) 引导启动将允许您阅读更多文本。(警告:这需要 ``vesafb`` ,因此对“早期” 的Oppses没有帮助) h]h)}(hX手动复制屏幕上的文本,并在机器重新启动后输入。很难受,但这是突然崩溃下 唯一的选择。或者你可以用数码相机拍下屏幕——虽然不那么好,但总比什么都没 有好。如果消息滚动超出控制台顶部,使用更高分辨率(例如 ``vga=791`` ) 引导启动将允许您阅读更多文本。(警告:这需要 ``vesafb`` ,因此对“早期” 的Oppses没有帮助)h](hX)手动复制屏幕上的文本,并在机器重新启动后输入。很难受,但这是突然崩溃下 唯一的选择。或者你可以用数码相机拍下屏幕——虽然不那么好,但总比什么都没 有好。如果消息滚动超出控制台顶部,使用更高分辨率(例如 }(hj@hhhNhNubj)}(h ``vga=791``h]hvga=791}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubhH ) 引导启动将允许您阅读更多文本。(警告:这需要 }(hj@hhhNhNubj)}(h ``vesafb``h]hvesafb}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubh2 ,因此对“早期” 的Oppses没有帮助)}(hj@hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKUhj<ubah}(h]h ]h"]h$]h&]uh1j:hj7hhhhhNubj;)}(h从串口终端启动(参见 :ref:`Documentation/admin-guide/serial-console.rst ` ), 在另一台机器上运行调制解调器然后用你喜欢的通信程序捕获输出。 Minicom运行良好。 h]h)}(h从串口终端启动(参见 :ref:`Documentation/admin-guide/serial-console.rst ` ), 在另一台机器上运行调制解调器然后用你喜欢的通信程序捕获输出。 Minicom运行良好。h](h从串口终端启动(参见 }(hj|hhhNhNubh)}(hD:ref:`Documentation/admin-guide/serial-console.rst `h]h)}(hjh]h,Documentation/admin-guide/serial-console.rst}(hjhhhNhNubah}(h]h ](hstdstd-refeh"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]refdoch refdomainjreftyperef refexplicitrefwarnjserial_consoleuh1hhhhK[hj|ubhy ), 在另一台机器上运行调制解调器然后用你喜欢的通信程序捕获输出。 Minicom运行良好。}(hj|hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK[hjxubah}(h]h ]h"]h$]h&]uh1j:hj7hhhhhNubj;)}(h使用Kdump(参阅 Documentation/admin-guide/kdump/kdump.rst ),使用 Documentation/admin-guide/kdump/gdbmacros.txt 中的dmesg gdbmacro从旧内存 中提取内核环形缓冲区。 h]h)}(h使用Kdump(参阅 Documentation/admin-guide/kdump/kdump.rst ),使用 Documentation/admin-guide/kdump/gdbmacros.txt 中的dmesg gdbmacro从旧内存 中提取内核环形缓冲区。h]h使用Kdump(参阅 Documentation/admin-guide/kdump/kdump.rst ),使用 Documentation/admin-guide/kdump/gdbmacros.txt 中的dmesg gdbmacro从旧内存 中提取内核环形缓冲区。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK`hjubah}(h]h ]h"]h$]h&]uh1j:hj7hhhhhNubeh}(h]h ]h"]h$]h&]enumtypearabicprefix(suffix)uh1j5hjXhhhhhKUubeh}(h]oopsah ]h"]oops消息在哪?ah$]h&]uh1jdhjfhhhhhKHubje)}(hhh](jj)}(h找到缺陷位置h]h找到缺陷位置}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jihjhhhhhKeubh)}(h如果你能指出缺陷在内核源代码中的位置,则报告缺陷的效果会非常好。这有两种方法。 通常来说使用 ``gdb`` 会比较容易,不过内核需要用调试信息来预编译。h](h如果你能指出缺陷在内核源代码中的位置,则报告缺陷的效果会非常好。这有两种方法。 通常来说使用 }(hjhhhNhNubj)}(h``gdb``h]hgdb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhC 会比较容易,不过内核需要用调试信息来预编译。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKghjhhubje)}(hhh](jj)}(hgdbh]hgdb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jihjhhhhhKkubh)}(h|GNU 调试器(GNU debugger, ``gdb`` )是从 ``vmlinux`` 文件中找出OOPS的确切 文件和行号的最佳方法。h](h GNU 调试器(GNU debugger, }(hj"hhhNhNubj)}(h``gdb``h]hgdb}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh )是从 }(hj"hhhNhNubj)}(h ``vmlinux``h]hvmlinux}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh? 文件中找出OOPS的确切 文件和行号的最佳方法。}(hj"hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKmhjhhubh)}(ht在使用 ``CONFIG_DEBUG_INFO`` 编译的内核上使用gdb效果最好。可通过运行以下命令 进行设置::h](h 在使用 }(hjThhhNhNubj)}(h``CONFIG_DEBUG_INFO``h]hCONFIG_DEBUG_INFO}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubhT 编译的内核上使用gdb效果最好。可通过运行以下命令 进行设置:}(hjThhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKphjhhubj)}(h@$ ./scripts/config -d COMPILE_TEST -e DEBUG_KERNEL -e DEBUG_INFOh]h@$ ./scripts/config -d COMPILE_TEST -e DEBUG_KERNEL -e DEBUG_INFO}hjtsbah}(h]h ]h"]h$]h&]jjuh1jhhhKshjhhubh)}(hV在用 ``CONFIG_DEBUG_INFO`` 编译的内核上,你可以直接从OOPS复制EIP值::h](h在用 }(hjhhhNhNubj)}(h``CONFIG_DEBUG_INFO``h]hCONFIG_DEBUG_INFO}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh9 编译的内核上,你可以直接从OOPS复制EIP值:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKuhjhhubj)}(h,EIP: 0060:[] Not tainted VLIh]h,EIP: 0060:[] Not tainted VLI}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKwhjhhubh)}(h,并使用GDB来将其翻译成可读形式::h]h+并使用GDB来将其翻译成可读形式:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKyhjhhubj)}(h!$ gdb vmlinux (gdb) l *0xc021e50eh]h!$ gdb vmlinux (gdb) l *0xc021e50e}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhK{hjhhubh)}(hJ如果没有启用 ``CONFIG_DEBUG_INFO`` ,则使用OOPS的函数偏移::h](h如果没有启用 }(hjhhhNhNubj)}(h``CONFIG_DEBUG_INFO``h]hCONFIG_DEBUG_INFO}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh! ,则使用OOPS的函数偏移:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK~hjhhubj)}(hEIP is at vt_ioctl+0xda8/0x1482h]hEIP is at vt_ioctl+0xda8/0x1482}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubh)}(hC并在启用 ``CONFIG_DEBUG_INFO`` 的情况下重新编译内核::h](h 并在启用 }(hjhhhNhNubj)}(h``CONFIG_DEBUG_INFO``h]hCONFIG_DEBUG_INFO}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 的情况下重新编译内核:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(hX$ ./scripts/config -d COMPILE_TEST -e DEBUG_KERNEL -e DEBUG_INFO $ make vmlinux $ gdb vmlinux (gdb) l *vt_ioctl+0xda8 0x1888 is in vt_ioctl (drivers/tty/vt/vt_ioctl.c:293). 288 { 289 struct vc_data *vc = NULL; 290 int ret = 0; 291 292 console_lock(); 293 if (VT_BUSY(vc_num)) 294 ret = -EBUSY; 295 else if (vc_num) 296 vc = vc_deallocate(vc_num); 297 console_unlock();h]hX$ ./scripts/config -d COMPILE_TEST -e DEBUG_KERNEL -e DEBUG_INFO $ make vmlinux $ gdb vmlinux (gdb) l *vt_ioctl+0xda8 0x1888 is in vt_ioctl (drivers/tty/vt/vt_ioctl.c:293). 288 { 289 struct vc_data *vc = NULL; 290 int ret = 0; 291 292 console_lock(); 293 if (VT_BUSY(vc_num)) 294 ret = -EBUSY; 295 else if (vc_num) 296 vc = vc_deallocate(vc_num); 297 console_unlock();}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubh)}(h&或者若您想要更详细的显示::h]h%或者若您想要更详细的显示:}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(ht(gdb) p vt_ioctl $1 = {int (struct tty_struct *, unsigned int, unsigned long)} 0xae0 (gdb) l *0xae0+0xda8h]ht(gdb) p vt_ioctl $1 = {int (struct tty_struct *, unsigned int, unsigned long)} 0xae0 (gdb) l *0xae0+0xda8}hj6sbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubh)}(h,您也可以使用对象文件作为替代::h]h+您也可以使用对象文件作为替代:}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(hK$ make drivers/tty/ $ gdb drivers/tty/vt/vt_ioctl.o (gdb) l *vt_ioctl+0xda8h]hK$ make drivers/tty/ $ gdb drivers/tty/vt/vt_ioctl.o (gdb) l *vt_ioctl+0xda8}hjRsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubh)}(h#如果你有调用跟踪,类似::h]h"如果你有调用跟踪,类似:}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(hCall Trace: [] :jbd:log_wait_commit+0xa3/0xf5 [] autoremove_wake_function+0x0/0x2e [] :jbd:journal_stop+0x1be/0x1ee ...h]hCall Trace: [] :jbd:log_wait_commit+0xa3/0xf5 [] autoremove_wake_function+0x0/0x2e [] :jbd:journal_stop+0x1be/0x1ee ...}hjnsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubh)}(hc这表明问题可能在 :jbd: 模块中。您可以在gdb中加载该模块并列出相关代码::h]hb这表明问题可能在 :jbd: 模块中。您可以在gdb中加载该模块并列出相关代码:}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(h1$ gdb fs/jbd/jbd.ko (gdb) l *log_wait_commit+0xa3h]h1$ gdb fs/jbd/jbd.ko (gdb) l *log_wait_commit+0xa3}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubh)}(hX3您还可以对堆栈跟踪处的任何函数调用执行相同的操作,例如:: [] ? dvb_usb_adapter_frontend_exit+0x3a/0x70 [dvb_usb] 上述调用发生的位置可以通过以下方式看到:: $ gdb drivers/media/usb/dvb-usb/dvb-usb.o (gdb) l *dvb_usb_adapter_frontend_exit+0x3ah](h)}(hS您还可以对堆栈跟踪处的任何函数调用执行相同的操作,例如::h]hR您还可以对堆栈跟踪处的任何函数调用执行相同的操作,例如:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubj)}(h@[] ? dvb_usb_adapter_frontend_exit+0x3a/0x70 [dvb_usb]h]h@[] ? dvb_usb_adapter_frontend_exit+0x3a/0x70 [dvb_usb]}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjubh)}(h;上述调用发生的位置可以通过以下方式看到::h]h:上述调用发生的位置可以通过以下方式看到:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubj)}(hU$ gdb drivers/media/usb/dvb-usb/dvb-usb.o (gdb) l *dvb_usb_adapter_frontend_exit+0x3ah]hU$ gdb drivers/media/usb/dvb-usb/dvb-usb.o (gdb) l *dvb_usb_adapter_frontend_exit+0x3a}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjubeh}(h]h ]h"]h$]h&]uh1hhjhhhhhNubeh}(h]gdbah ]h"]gdbah$]h&]uh1jdhjhhhhhKkubje)}(hhh](jj)}(hobjdumph]hobjdump}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jihjhhhhhKubh)}(hXI要调试内核,请使用objdump并从崩溃输出中查找十六进制偏移,以找到有效的代码/汇 编行。如果没有调试符号,您将看到所示例程的汇编程序代码,但是如果内核有调试 符号,C代码也将可见(调试符号可以在内核配置菜单的hacking项中启用)。例如::h]hXH要调试内核,请使用objdump并从崩溃输出中查找十六进制偏移,以找到有效的代码/汇 编行。如果没有调试符号,您将看到所示例程的汇编程序代码,但是如果内核有调试 符号,C代码也将可见(调试符号可以在内核配置菜单的hacking项中启用)。例如:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(h0$ objdump -r -S -l --disassemble net/dccp/ipv4.oh]h0$ objdump -r -S -l --disassemble net/dccp/ipv4.o}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubh)}(h@您需要处于内核树的顶层以便此获得您的C文件。h]h)}(hjh]h@您需要处于内核树的顶层以便此获得您的C文件。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjhhhhhNubh)}(h如果您无法访问源代码,仍然可以使用以下方法调试一些崩溃转储(如Dave Miller的 示例崩溃转储输出所示)::h]h如果您无法访问源代码,仍然可以使用以下方法调试一些崩溃转储(如Dave Miller的 示例崩溃转储输出所示):}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(hXEIP is at +0x14/0x4c0 ... Code: 44 24 04 e8 6f 05 00 00 e9 e8 fe ff ff 8d 76 00 8d bc 27 00 00 00 00 55 57 56 53 81 ec bc 00 00 00 8b ac 24 d0 00 00 00 8b 5d 08 <8b> 83 3c 01 00 00 89 44 24 14 8b 45 28 85 c0 89 44 24 18 0f 85 Put the bytes into a "foo.s" file like this: .text .globl foo foo: .byte .... /* bytes from Code: part of OOPS dump */ Compile it with "gcc -c -o foo.o foo.s" then look at the output of "objdump --disassemble foo.o". Output: ip_queue_xmit: push %ebp push %edi push %esi push %ebx sub $0xbc, %esp mov 0xd0(%esp), %ebp ! %ebp = arg0 (skb) mov 0x8(%ebp), %ebx ! %ebx = skb->sk mov 0x13c(%ebx), %eax ! %eax = inet_sk(sk)->opth]hXEIP is at +0x14/0x4c0 ... Code: 44 24 04 e8 6f 05 00 00 e9 e8 fe ff ff 8d 76 00 8d bc 27 00 00 00 00 55 57 56 53 81 ec bc 00 00 00 8b ac 24 d0 00 00 00 8b 5d 08 <8b> 83 3c 01 00 00 89 44 24 14 8b 45 28 85 c0 89 44 24 18 0f 85 Put the bytes into a "foo.s" file like this: .text .globl foo foo: .byte .... /* bytes from Code: part of OOPS dump */ Compile it with "gcc -c -o foo.o foo.s" then look at the output of "objdump --disassemble foo.o". Output: ip_queue_xmit: push %ebp push %edi push %esi push %ebx sub $0xbc, %esp mov 0xd0(%esp), %ebp ! %ebp = arg0 (skb) mov 0x8(%ebp), %ebx ! %ebx = skb->sk mov 0x13c(%ebx), %eax ! %eax = inet_sk(sk)->opt}hj4sbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubh)}(hs`scripts/decodecode` 文件可以用来自动完成大部分工作,这取决于正在调试的CPU 体系结构。h](j)}(h`scripts/decodecode`h]hscripts/decodecode}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubh_ 文件可以用来自动完成大部分工作,这取决于正在调试的CPU 体系结构。}(hjBhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]objdumpah ]h"]objdumpah$]h&]uh1jdhjhhhhhKubeh}(h]id3ah ]h"]找到缺陷位置ah$]h&]uh1jdhjfhhhhhKeubje)}(hhh](jj)}(h 报告缺陷h]h 报告缺陷}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jihjnhhhhhKubh)}(hr一旦你通过定位缺陷找到了其发生的地方,你可以尝试自己修复它或者向上游报告它。h]hr一旦你通过定位缺陷找到了其发生的地方,你可以尝试自己修复它或者向上游报告它。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjnhhubh)}(h}为了向上游报告,您应该找出用于开发受影响代码的邮件列表。这可以使用 ``get_maintainer.pl`` 。h](hd为了向上游报告,您应该找出用于开发受影响代码的邮件列表。这可以使用 }(hjhhhNhNubj)}(h``get_maintainer.pl``h]hget_maintainer.pl}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjnhhubh)}(ho例如,您在gspca的sonixj.c文件中发现一个缺陷,则可以通过以下方法找到它的维护者::h]hn例如,您在gspca的sonixj.c文件中发现一个缺陷,则可以通过以下方法找到它的维护者:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjnhhubj)}(hX4$ ./scripts/get_maintainer.pl -f drivers/media/usb/gspca/sonixj.c Hans Verkuil (odd fixer:GSPCA USB WEBCAM DRIVER,commit_signer:1/1=100%) Mauro Carvalho Chehab (maintainer:MEDIA INPUT INFRASTRUCTURE (V4L/DVB),commit_signer:1/1=100%) Tejun Heo (commit_signer:1/1=100%) Bhaktipriya Shridhar (commit_signer:1/1=100%,authored:1/1=100%,added_lines:4/4=100%,removed_lines:9/9=100%) linux-media@vger.kernel.org (open list:GSPCA USB WEBCAM DRIVER) linux-kernel@vger.kernel.org (open list)h]hX4$ ./scripts/get_maintainer.pl -f drivers/media/usb/gspca/sonixj.c Hans Verkuil (odd fixer:GSPCA USB WEBCAM DRIVER,commit_signer:1/1=100%) Mauro Carvalho Chehab (maintainer:MEDIA INPUT INFRASTRUCTURE (V4L/DVB),commit_signer:1/1=100%) Tejun Heo (commit_signer:1/1=100%) Bhaktipriya Shridhar (commit_signer:1/1=100%,authored:1/1=100%,added_lines:4/4=100%,removed_lines:9/9=100%) linux-media@vger.kernel.org (open list:GSPCA USB WEBCAM DRIVER) linux-kernel@vger.kernel.org (open list)}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjnhhubh)}(h请注意它将指出:h]h请注意它将指出:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjnhhubh bullet_list)}(hhh](j;)}(h最后接触源代码的开发人员(如果这是在git树中完成的)。在上面的例子中是Tejun 和Bhaktipriya(在这个特定的案例中,没有人真正参与这个文件的开发);h]h)}(h最后接触源代码的开发人员(如果这是在git树中完成的)。在上面的例子中是Tejun 和Bhaktipriya(在这个特定的案例中,没有人真正参与这个文件的开发);h]h最后接触源代码的开发人员(如果这是在git树中完成的)。在上面的例子中是Tejun 和Bhaktipriya(在这个特定的案例中,没有人真正参与这个文件的开发);}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j:hjhhhhhNubj;)}(h'驱动维护人员(Hans Verkuil);h]h)}(hjh]h'驱动维护人员(Hans Verkuil);}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j:hjhhhhhNubj;)}(h3子系统维护人员(Mauro Carvalho Chehab);h]h)}(hj h]h3子系统维护人员(Mauro Carvalho Chehab);}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j:hjhhhhhNubj;)}(hL驱动程序和/或子系统邮件列表(linux-media@vger.kernel.org);h]h)}(hj$h](h+驱动程序和/或子系统邮件列表(}(hj&hhhNhNubj7)}(hlinux-media@vger.kernel.orgh]hlinux-media@vger.kernel.org}(hj-hhhNhNubah}(h]h ]h"]h$]h&]refuri"mailto:linux-media@vger.kernel.orguh1j6hj&ubh);}(hj&hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj"ubah}(h]h ]h"]h$]h&]uh1j:hjhhhhhNubj;)}(h=Linux内核邮件列表(linux-kernel@vger.kernel.org)。 h]h)}(h` , 以帮助您的代码被接受。h](h请务必阅读 }(hjhhhNhNubh)}(hG:ref:`Documentation/process/submitting-patches.rst `h]h)}(hjh]h,Documentation/process/submitting-patches.rst}(hjhhhNhNubah}(h]h ](hstdstd-refeh"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]refdoch refdomainjreftyperef refexplicitrefwarnjsubmittingpatchesuh1hhhhMhjubh& , 以帮助您的代码被接受。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]id5ah ]h"] 修复缺陷ah$]h&]uh1jdhjfhhhhhM ubh transition)}(hK---------------------------------------------------------------------------h]h}(h]h ]h"]h$]h&]uh1j@hhhMhjfhhubje)}(hhh](jj)}(h-用 ``klogd`` 进行Oops跟踪的注意事项h](h用 }(hjOhhhNhNubj)}(h ``klogd``h]hklogd}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubh 进行Oops跟踪的注意事项}(hjOhhhNhNubeh}(h]h ]h"]h$]h&]uh1jihjLhhhhhMubh)}(h为了帮助Linus和其他内核开发人员, ``klogd`` 对保护故障的处理提供了大量支持。 为了完整支持地址解析,至少应该使用 ``sysklogd`` 包的1.3-pl3版本。h](h0为了帮助Linus和其他内核开发人员, }(hjohhhNhNubj)}(h ``klogd``h]hklogd}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubhf 对保护故障的处理提供了大量支持。 为了完整支持地址解析,至少应该使用 }(hjohhhNhNubj)}(h ``sysklogd``h]hsysklogd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubh 包的1.3-pl3版本。}(hjohhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjLhhubh)}(hX>当发生保护故障时, ``klogd`` 守护进程会自动将内核日志消息中的重要地址转换为 它们的等效符号。然后通过 ``klogd`` 使用的任何报告机制来转发这个已翻译的内核 消息。保护错误消息可以直接从消息文件中剪切出来并转发给内核开发人员。h](h当发生保护故障时, }(hjhhhNhNubj)}(h ``klogd``h]hklogd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhl 守护进程会自动将内核日志消息中的重要地址转换为 它们的等效符号。然后通过 }(hjhhhNhNubj)}(h ``klogd``h]hklogd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 使用的任何报告机制来转发这个已翻译的内核 消息。保护错误消息可以直接从消息文件中剪切出来并转发给内核开发人员。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjLhhubh)}(hX6``klogd`` 执行两种类型的地址解析,静态翻译和动态翻译。静态翻译使用System.map 文件。为了进行静态转换, ``klogd`` 守护进程必须能够在守护进程初始化时找到系 统映射文件。有关 ``klogd`` 如何搜索映射文件的信息,请参见klogd手册页。h](j)}(h ``klogd``h]hklogd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 执行两种类型的地址解析,静态翻译和动态翻译。静态翻译使用System.map 文件。为了进行静态转换, }(hjhhhNhNubj)}(h ``klogd``h]hklogd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhW 守护进程必须能够在守护进程初始化时找到系 统映射文件。有关 }(hjhhhNhNubj)}(h ``klogd``h]hklogd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh? 如何搜索映射文件的信息,请参见klogd手册页。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM#hjLhhubh)}(h当使用内核可加载模块时,动态地址转换非常重要。由于内核模块的内存是从内核的 动态内存池中分配的,因此无论是模块的开头还是模块中的函数和符号都没有固定的 位置。h]h当使用内核可加载模块时,动态地址转换非常重要。由于内核模块的内存是从内核的 动态内存池中分配的,因此无论是模块的开头还是模块中的函数和符号都没有固定的 位置。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM'hjLhhubh)}(h内核支持系统调用,允许程序确定加载哪些模块及其在内存中的位置。klogd守护进程 使用这些系统调用构建了一个符号表,可用于调试可加载内核模块中发生的保护错误。h]h内核支持系统调用,允许程序确定加载哪些模块及其在内存中的位置。klogd守护进程 使用这些系统调用构建了一个符号表,可用于调试可加载内核模块中发生的保护错误。}(hj! hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM+hjLhhubh)}(hklogd至少会提供产生保护故障的模块的名称。如果可加载模块的开发人员选择从模块 导出符号信息,则可能会有其他可用的符号信息。h]hklogd至少会提供产生保护故障的模块的名称。如果可加载模块的开发人员选择从模块 导出符号信息,则可能会有其他可用的符号信息。}(hj/ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM.hjLhhubh)}(hX?由于内核模块环境可以是动态的,因此当模块环境发生变化时,必须有一种通知 ``klogd`` 守护进程的机制。有一些可用的命令行选项允许klogd向当前正在执行的守 护进程发出信号示意应该刷新符号信息。有关更多信息,请参阅 ``klogd`` 手册页。h](hj由于内核模块环境可以是动态的,因此当模块环境发生变化时,必须有一种通知 }(hj= hhhNhNubj)}(h ``klogd``h]hklogd}(hjE hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj= ubh 守护进程的机制。有一些可用的命令行选项允许klogd向当前正在执行的守 护进程发出信号示意应该刷新符号信息。有关更多信息,请参阅 }(hj= hhhNhNubj)}(h ``klogd``h]hklogd}(hjW hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj= ubh 手册页。}(hj= hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM1hjLhhubh)}(hsysklogd发行版附带了一个补丁,它修改了 ``modules-2.0.0`` 包,以便在加载或 卸载模块时自动向klogd发送信号。应用此补丁基本上可无缝支持调试内核可加载模块 发生的保护故障。h](h6sysklogd发行版附带了一个补丁,它修改了 }(hjo hhhNhNubj)}(h``modules-2.0.0``h]h modules-2.0.0}(hjw hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjo ubh 包,以便在加载或 卸载模块时自动向klogd发送信号。应用此补丁基本上可无缝支持调试内核可加载模块 发生的保护故障。}(hjo hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM5hjLhhubh)}(hF以下是 ``klogd`` 处理的可加载模块中的保护故障示例::h](h 以下是 }(hj hhhNhNubj)}(h ``klogd``h]hklogd}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh2 处理的可加载模块中的保护故障示例:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM9hjLhhubj)}(hX9Aug 29 09:51:01 blizard kernel: Unable to handle kernel paging request at virtual address f15e97cc Aug 29 09:51:01 blizard kernel: current->tss.cr3 = 0062d000, %cr3 = 0062d000 Aug 29 09:51:01 blizard kernel: *pde = 00000000 Aug 29 09:51:01 blizard kernel: Oops: 0002 Aug 29 09:51:01 blizard kernel: CPU: 0 Aug 29 09:51:01 blizard kernel: EIP: 0010:[oops:_oops+16/3868] Aug 29 09:51:01 blizard kernel: EFLAGS: 00010212 Aug 29 09:51:01 blizard kernel: eax: 315e97cc ebx: 003a6f80 ecx: 001be77b edx: 00237c0c Aug 29 09:51:01 blizard kernel: esi: 00000000 edi: bffffdb3 ebp: 00589f90 esp: 00589f8c Aug 29 09:51:01 blizard kernel: ds: 0018 es: 0018 fs: 002b gs: 002b ss: 0018 Aug 29 09:51:01 blizard kernel: Process oops_test (pid: 3374, process nr: 21, stackpage=00589000) Aug 29 09:51:01 blizard kernel: Stack: 315e97cc 00589f98 0100b0b4 bffffed4 0012e38e 00240c64 003a6f80 00000001 Aug 29 09:51:01 blizard kernel: 00000000 00237810 bfffff00 0010a7fa 00000003 00000001 00000000 bfffff00 Aug 29 09:51:01 blizard kernel: bffffdb3 bffffed4 ffffffda 0000002b 0007002b 0000002b 0000002b 00000036 Aug 29 09:51:01 blizard kernel: Call Trace: [oops:_oops_ioctl+48/80] [_sys_ioctl+254/272] [_system_call+82/128] 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 c3h]hX9Aug 29 09:51:01 blizard kernel: Unable to handle kernel paging request at virtual address f15e97cc Aug 29 09:51:01 blizard kernel: current->tss.cr3 = 0062d000, %cr3 = 0062d000 Aug 29 09:51:01 blizard kernel: *pde = 00000000 Aug 29 09:51:01 blizard kernel: Oops: 0002 Aug 29 09:51:01 blizard kernel: CPU: 0 Aug 29 09:51:01 blizard kernel: EIP: 0010:[oops:_oops+16/3868] Aug 29 09:51:01 blizard kernel: EFLAGS: 00010212 Aug 29 09:51:01 blizard kernel: eax: 315e97cc ebx: 003a6f80 ecx: 001be77b edx: 00237c0c Aug 29 09:51:01 blizard kernel: esi: 00000000 edi: bffffdb3 ebp: 00589f90 esp: 00589f8c Aug 29 09:51:01 blizard kernel: ds: 0018 es: 0018 fs: 002b gs: 002b ss: 0018 Aug 29 09:51:01 blizard kernel: Process oops_test (pid: 3374, process nr: 21, stackpage=00589000) Aug 29 09:51:01 blizard kernel: Stack: 315e97cc 00589f98 0100b0b4 bffffed4 0012e38e 00240c64 003a6f80 00000001 Aug 29 09:51:01 blizard kernel: 00000000 00237810 bfffff00 0010a7fa 00000003 00000001 00000000 bfffff00 Aug 29 09:51:01 blizard kernel: bffffdb3 bffffed4 ffffffda 0000002b 0007002b 0000002b 0000002b 00000036 Aug 29 09:51:01 blizard kernel: Call Trace: [oops:_oops_ioctl+48/80] [_sys_ioctl+254/272] [_system_call+82/128] 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}hj sbah}(h]h ]h"]h$]h&]jjuh1jhhhM;hjLhhubeh}(h] klogd-oopsah ]h"])用 klogd 进行oops跟踪的注意事项ah$]h&]uh1jdhjfhhhhhMubeh}(h]id1ah ]h"] 追踪缺陷ah$]h&]uh1jdhhhhhhhK ubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(jiN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh، _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(j j jUjRjjjkjhjjjcj`jjj=j:j j u nametypes}(j jUjjkjjcjj=j uh}(j jfjRjjjXjhjjjj`jjjnj:jj jLu footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}j KsRparse_messages]transform_messages] transformerN include_log]