.. include:: ../disclaimer-zh_CN.rst :Original: :doc:`../../../admin-guide/bug-hunting` :译者: å´æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> 追踪缺陷 ========= å†…æ ¸é”™è¯¯æŠ¥å‘Šé€šå¸¸é™„å¸¦å¦‚ä¸‹å †æ ˆè½¬å‚¨:: ------------[ 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: [<c12ba080>] ? dump_stack+0x44/0x64 [<c103ed6a>] ? __warn+0xfa/0x120 [<c109e8a7>] ? module_put+0x57/0x70 [<c109e8a7>] ? module_put+0x57/0x70 [<c103ee33>] ? warn_slowpath_null+0x23/0x30 [<c109e8a7>] ? module_put+0x57/0x70 [<f80ca4d0>] ? gp8psk_fe_set_frontend+0x460/0x460 [dvb_usb_gp8psk] [<c109f617>] ? symbol_put_addr+0x27/0x50 [<f80bc9ca>] ? dvb_usb_adapter_frontend_exit+0x3a/0x70 [dvb_usb] [<f80bb3bf>] ? dvb_usb_exit+0x2f/0xd0 [dvb_usb] [<c13d03bc>] ? usb_disable_endpoint+0x7c/0xb0 [<f80bb48a>] ? dvb_usb_device_exit+0x2a/0x50 [dvb_usb] [<c13d2882>] ? usb_unbind_interface+0x62/0x250 [<c136b514>] ? __pm_runtime_idle+0x44/0x70 [<c13620d8>] ? __device_release_driver+0x78/0x120 [<c1362907>] ? driver_detach+0x87/0x90 [<c1361c48>] ? bus_remove_driver+0x38/0x90 [<c13d1c18>] ? usb_deregister+0x58/0xb0 [<c109fbb0>] ? SyS_delete_module+0x130/0x1f0 [<c1055654>] ? task_work_run+0x64/0x80 [<c1000fa5>] ? exit_to_usermode_loop+0x85/0x90 [<c10013f0>] ? do_fast_syscall_32+0x80/0x130 [<c1549f43>] ? sysenter_past_esp+0x40/0x6a ---[ end trace 6ebc60ef3981792f ]--- è¿™æ ·çš„å †æ ˆè·Ÿè¸ªæä¾›äº†è¶³å¤Ÿçš„ä¿¡æ¯æ¥è¯†åˆ«å†…æ ¸æºä»£ç ä¸å‘ç”Ÿé”™è¯¯çš„é‚£ä¸€è¡Œã€‚æ ¹æ®é—®é¢˜çš„ 䏥釿€§ï¼Œå®ƒè¿˜å¯èƒ½åŒ…å« **“Oopsâ€** 一è¯ï¼Œæ¯”如:: BUG: unable to handle kernel NULL pointer dereference at (null) IP: [<c06969d4>] iret_exc+0x7d0/0xa59 *pdpt = 000000002258a001 *pde = 0000000000000000 Oops: 0002 [#1] PREEMPT SMP ... 尽管有 **Oops** æˆ–å…¶ä»–ç±»åž‹çš„å †æ ˆè·Ÿè¸ªï¼Œä½†é€šå¸¸éœ€è¦æ‰¾åˆ°å‡ºé—®é¢˜çš„行æ¥è¯†åˆ«å’Œå¤„ç†ç¼º é™·ã€‚åœ¨æœ¬ç« ä¸ï¼Œæˆ‘们将å‚考“Oopsâ€æ¥äº†è§£éœ€è¦åˆ†æžçš„å„ç§å †æ ˆè·Ÿè¸ªã€‚ å¦‚æžœå†…æ ¸æ˜¯ç”¨ ``CONFIG_DEBUG_INFO`` 编译的,那么å¯ä»¥ä½¿ç”¨æ–‡ä»¶ï¼š `scripts/decode_stacktrace.sh` 。 é“¾æŽ¥çš„æ¨¡å— ----------- å—到污染或æ£åœ¨åŠ è½½/å¸è½½çš„æ¨¡å—ç”¨â€œï¼ˆâ€¦ï¼‰â€æ ‡è®°ï¼Œæ±¡æŸ“æ ‡å¿—åœ¨ `Documentation/admin-guide/tainted-kernels.rst` 文件ä¸è¿›è¡Œäº†æè¿°ï¼Œâ€œæ£åœ¨è¢«åŠ è½½â€ç”¨â€œ+â€æ ‡æ³¨ï¼Œâ€œæ£åœ¨è¢«å¸è½½â€ç”¨â€œ-â€æ ‡æ³¨ã€‚ Oops消æ¯åœ¨å“ªï¼Ÿ --------------- 通常,Oops文本由klogdä»Žå†…æ ¸ç¼“å†²åŒºè¯»å–,然åŽäº¤ç»™ ``syslogd`` ,åŽè€…将其写入 syslog文件,通常是 ``/var/log/messages`` (å–决于 ``/etc/syslog.conf`` )。 在使用systemd的系统上,它也å¯ä»¥ç”± ``journald`` 守护进程å˜å‚¨ï¼Œå¹¶é€šè¿‡è¿è¡Œ ``journalctl`` 命令进行访问。 有时 ``klogd`` ä¼šæŒ‚æŽ‰ï¼Œè¿™ç§æƒ…况下您å¯ä»¥è¿è¡Œ ``dmesg > file`` ä»Žå†…æ ¸ç¼“å†²åŒº è¯»å–æ•°æ®å¹¶ä¿å˜å®ƒã€‚或者您å¯ä»¥ ``cat /proc/kmsg > file`` ,但是您必须适时 䏿–ä»¥åœæ¢ä¼ è¾“ï¼Œå› ä¸º ``kmsg`` æ˜¯ä¸€ä¸ªâ€œæ°¸æ— æ¢å¢ƒçš„æ–‡ä»¶â€ã€‚ 如果机器严é‡å´©æºƒï¼Œæ— 法输入命令或ç£ç›˜ä¸å¯ç”¨ï¼Œé‚£è¿˜æœ‰ä¸‰ä¸ªé€‰é¡¹ï¼š (1) 手动å¤åˆ¶å±å¹•ä¸Šçš„æ–‡æœ¬ï¼Œå¹¶åœ¨æœºå™¨é‡æ–°å¯åЍåŽè¾“入。很难å—,但这是çªç„¶å´©æºƒä¸‹ å”¯ä¸€çš„é€‰æ‹©ã€‚æˆ–è€…ä½ å¯ä»¥ç”¨æ•°ç 相机æ‹ä¸‹å±å¹•——虽然ä¸é‚£ä¹ˆå¥½ï¼Œä½†æ€»æ¯”什么都没 æœ‰å¥½ã€‚å¦‚æžœæ¶ˆæ¯æ»šåŠ¨è¶…å‡ºæŽ§åˆ¶å°é¡¶éƒ¨ï¼Œä½¿ç”¨æ›´é«˜åˆ†è¾¨çŽ‡ï¼ˆä¾‹å¦‚ ``vga=791`` ) 引导å¯åЍ将å…许您阅读更多文本。(è¦å‘Šï¼šè¿™éœ€è¦ ``vesafb`` ï¼Œå› æ¤å¯¹â€œæ—©æœŸâ€ çš„Oppses没有帮助) (2) 从串å£ç»ˆç«¯å¯åŠ¨ï¼ˆå‚è§ :ref:`Documentation/admin-guide/serial-console.rst <serial_console>` ), 在å¦ä¸€å°æœºå™¨ä¸Šè¿è¡Œè°ƒåˆ¶è§£è°ƒå™¨ç„¶åŽç”¨ä½ å–œæ¬¢çš„é€šä¿¡ç¨‹åºæ•获输出。 Minicomè¿è¡Œè‰¯å¥½ã€‚ (3) 使用Kdump(å‚阅 Documentation/admin-guide/kdump/kdump.rst ),使用 Documentation/admin-guide/kdump/gdbmacros.txt ä¸çš„dmesg gdbmacroä»Žæ—§å†…å˜ ä¸æå–å†…æ ¸çŽ¯å½¢ç¼“å†²åŒºã€‚ 找到缺陷ä½ç½® ------------- å¦‚æžœä½ èƒ½æŒ‡å‡ºç¼ºé™·åœ¨å†…æ ¸æºä»£ç ä¸çš„ä½ç½®ï¼Œåˆ™æŠ¥å‘Šç¼ºé™·çš„æ•ˆæžœä¼šéžå¸¸å¥½ã€‚è¿™æœ‰ä¸¤ç§æ–¹æ³•。 通常æ¥è¯´ä½¿ç”¨ ``gdb`` 会比较容易,ä¸è¿‡å†…æ ¸éœ€è¦ç”¨è°ƒè¯•ä¿¡æ¯æ¥é¢„编译。 gdb ^^^^ GNU 调试器(GNU debugger, ``gdb`` )是从 ``vmlinux`` æ–‡ä»¶ä¸æ‰¾å‡ºOOPS的确切 文件和行å·çš„æœ€ä½³æ–¹æ³•。 在使用 ``CONFIG_DEBUG_INFO`` ç¼–è¯‘çš„å†…æ ¸ä¸Šä½¿ç”¨gdb效果最好。å¯é€šè¿‡è¿è¡Œä»¥ä¸‹å‘½ä»¤ 进行设置:: $ ./scripts/config -d COMPILE_TEST -e DEBUG_KERNEL -e DEBUG_INFO 在用 ``CONFIG_DEBUG_INFO`` ç¼–è¯‘çš„å†…æ ¸ä¸Šï¼Œä½ å¯ä»¥ç›´æŽ¥ä»ŽOOPSå¤åˆ¶EIP值:: EIP: 0060:[<c021e50e>] Not tainted VLI 并使用GDBæ¥å°†å…¶ç¿»è¯‘æˆå¯è¯»å½¢å¼:: $ gdb vmlinux (gdb) l *0xc021e50e 如果没有å¯ç”¨ ``CONFIG_DEBUG_INFO`` ,则使用OOPS的函数åç§»:: EIP is at vt_ioctl+0xda8/0x1482 并在å¯ç”¨ ``CONFIG_DEBUG_INFO`` çš„æƒ…å†µä¸‹é‡æ–°ç¼–è¯‘å†…æ ¸:: $ ./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(); æˆ–è€…è‹¥æ‚¨æƒ³è¦æ›´è¯¦ç»†çš„æ˜¾ç¤º:: (gdb) p vt_ioctl $1 = {int (struct tty_struct *, unsigned int, unsigned long)} 0xae0 <vt_ioctl> (gdb) l *0xae0+0xda8 您也å¯ä»¥ä½¿ç”¨å¯¹è±¡æ–‡ä»¶ä½œä¸ºæ›¿ä»£:: $ make drivers/tty/ $ gdb drivers/tty/vt/vt_ioctl.o (gdb) l *vt_ioctl+0xda8 å¦‚æžœä½ æœ‰è°ƒç”¨è·Ÿè¸ªï¼Œç±»ä¼¼:: Call Trace: [<ffffffff8802c8e9>] :jbd:log_wait_commit+0xa3/0xf5 [<ffffffff810482d9>] autoremove_wake_function+0x0/0x2e [<ffffffff8802770b>] :jbd:journal_stop+0x1be/0x1ee ... 这表明问题å¯èƒ½åœ¨ :jbd: 模å—ä¸ã€‚您å¯ä»¥åœ¨gdbä¸åŠ è½½è¯¥æ¨¡å—并列出相关代ç :: $ gdb fs/jbd/jbd.ko (gdb) l *log_wait_commit+0xa3 .. note:: 您还å¯ä»¥å¯¹å †æ ˆè·Ÿè¸ªå¤„的任何函数调用执行相åŒçš„æ“ä½œï¼Œä¾‹å¦‚:: [<f80bc9ca>] ? 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+0x3a objdump ^^^^^^^^ è¦è°ƒè¯•å†…æ ¸ï¼Œè¯·ä½¿ç”¨objdumpå¹¶ä»Žå´©æºƒè¾“å‡ºä¸æŸ¥æ‰¾åå…进制å移,以找到有效的代ç /汇 编行。如果没有调试符å·ï¼Œæ‚¨å°†çœ‹åˆ°æ‰€ç¤ºä¾‹ç¨‹çš„æ±‡ç¼–程åºä»£ç ï¼Œä½†æ˜¯å¦‚æžœå†…æ ¸æœ‰è°ƒè¯• 符å·ï¼ŒC代ç 也将å¯è§ï¼ˆè°ƒè¯•符å·å¯ä»¥åœ¨å†…æ ¸é…ç½®èœå•çš„hacking项ä¸å¯ç”¨ï¼‰ã€‚例如:: $ objdump -r -S -l --disassemble net/dccp/ipv4.o .. note:: 您需è¦å¤„äºŽå†…æ ¸æ ‘çš„é¡¶å±‚ä»¥ä¾¿æ¤èŽ·å¾—æ‚¨çš„C文件。 å¦‚æžœæ‚¨æ— æ³•è®¿é—®æºä»£ç ,ä»ç„¶å¯ä»¥ä½¿ç”¨ä»¥ä¸‹æ–¹æ³•调试一些崩溃转储(如Dave Millerçš„ 示例崩溃转储输出所示):: EIP 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 `scripts/decodecode` 文件å¯ä»¥ç”¨æ¥è‡ªåŠ¨å®Œæˆå¤§éƒ¨åˆ†å·¥ä½œï¼Œè¿™å–决于æ£åœ¨è°ƒè¯•çš„CPU 体系结构。 报告缺陷 --------- ä¸€æ—¦ä½ é€šè¿‡å®šä½ç¼ºé™·æ‰¾åˆ°äº†å…¶å‘ç”Ÿçš„åœ°æ–¹ï¼Œä½ å¯ä»¥å°è¯•自己修å¤å®ƒæˆ–者å‘上游报告它。 为了å‘上游报告,您应该找出用于开å‘å—å½±å“代ç 的邮件列表。这å¯ä»¥ä½¿ç”¨ ``get_maintainer.pl`` 。 例如,您在gspcaçš„sonixj.c文件ä¸å‘现一个缺陷,则å¯ä»¥é€šè¿‡ä»¥ä¸‹æ–¹æ³•找到它的维护者:: $ ./scripts/get_maintainer.pl -f drivers/media/usb/gspca/sonixj.c Hans Verkuil <hverkuil@xs4all.nl> (odd fixer:GSPCA USB WEBCAM DRIVER,commit_signer:1/1=100%) Mauro Carvalho Chehab <mchehab@kernel.org> (maintainer:MEDIA INPUT INFRASTRUCTURE (V4L/DVB),commit_signer:1/1=100%) Tejun Heo <tj@kernel.org> (commit_signer:1/1=100%) Bhaktipriya Shridhar <bhaktipriya96@gmail.com> (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) 请注æ„它将指出: - æœ€åŽæŽ¥è§¦æºä»£ç 的开å‘人员(如果这是在gitæ ‘ä¸å®Œæˆçš„)。在上é¢çš„例å䏿˜¯Tejun å’ŒBhaktipriya(在这个特定的案例ä¸ï¼Œæ²¡æœ‰äººçœŸæ£å‚与这个文件的开å‘); - 驱动维护人员(Hans Verkuil); - å系统维护人员(Mauro Carvalho Chehab); - 驱动程åºå’Œ/或å系统邮件列表(linux-media@vger.kernel.org); - Linuxå†…æ ¸é‚®ä»¶åˆ—è¡¨ï¼ˆlinux-kernel@vger.kernel.org)。 通常,修å¤ç¼ºé™·çš„æœ€å¿«æ–¹æ³•是将它报告给用于开å‘相关代ç 的邮件列表(linux-media ML),抄é€é©±åŠ¨ç¨‹åºç»´æŠ¤è€…(Hans)。 å¦‚æžœä½ å®Œå…¨ä¸çŸ¥é“该把报告寄给è°ï¼Œä¸” ``get_maintainer.pl`` 也没有æä¾›ä»»ä½•有用 的信æ¯ï¼Œè¯·å‘é€åˆ°linux-kernel@vger.kernel.org。 感谢您的帮助,这使Linuxå°½å¯èƒ½ç¨³å®š:-) ä¿®å¤ç¼ºé™· --------- å¦‚æžœä½ æ‡‚å¾—ç¼–ç¨‹ï¼Œä½ ä¸ä»…å¯ä»¥é€šè¿‡æŠ¥å‘Šé”™è¯¯æ¥å¸®åŠ©æˆ‘ä»¬ï¼Œè¿˜å¯ä»¥æä¾›ä¸€ä¸ªè§£å†³æ–¹æ¡ˆã€‚ 毕竟,开æºå°±æ˜¯åˆ†äº«ä½ çš„å·¥ä½œï¼Œä½ ä¸æƒ³å› ä¸ºä½ çš„å¤©æ‰è€Œè¢«è®¤å¯å—? å¦‚æžœä½ å†³å®šè¿™æ ·åšï¼Œè¯·åœ¨åˆ¶å®šè§£å†³æ–¹æ¡ˆåŽå°†å…¶æäº¤åˆ°ä¸Šæ¸¸ã€‚ 请务必阅读 :ref:`Documentation/process/submitting-patches.rst <submittingpatches>` , 以帮助您的代ç 被接å—。 --------------------------------------------------------------------------- 用 ``klogd`` 进行Oops跟踪的注æ„事项 ------------------------------------ 为了帮助Linuså’Œå…¶ä»–å†…æ ¸å¼€å‘人员, ``klogd`` å¯¹ä¿æŠ¤æ•…éšœçš„å¤„ç†æä¾›äº†å¤§é‡æ”¯æŒã€‚ 为了完整支æŒåœ°å€è§£æžï¼Œè‡³å°‘应该使用 ``sysklogd`` 包的1.3-pl3版本。 当å‘ç”Ÿä¿æŠ¤æ•…éšœæ—¶ï¼Œ ``klogd`` å®ˆæŠ¤è¿›ç¨‹ä¼šè‡ªåŠ¨å°†å†…æ ¸æ—¥å¿—æ¶ˆæ¯ä¸çš„é‡è¦åœ°å€è½¬æ¢ä¸º å®ƒä»¬çš„ç‰æ•ˆç¬¦å·ã€‚ç„¶åŽé€šè¿‡ ``klogd`` 使用的任何报告机制æ¥è½¬å‘è¿™ä¸ªå·²ç¿»è¯‘çš„å†…æ ¸ 消æ¯ã€‚ä¿æŠ¤é”™è¯¯æ¶ˆæ¯å¯ä»¥ç›´æŽ¥ä»Žæ¶ˆæ¯æ–‡ä»¶ä¸å‰ªåˆ‡å‡ºæ¥å¹¶è½¬å‘ç»™å†…æ ¸å¼€å‘人员。 ``klogd`` 执行两ç§ç±»åž‹çš„地å€è§£æžï¼Œé™æ€ç¿»è¯‘和动æ€ç¿»è¯‘ã€‚é™æ€ç¿»è¯‘使用System.map æ–‡ä»¶ã€‚ä¸ºäº†è¿›è¡Œé™æ€è½¬æ¢ï¼Œ ``klogd`` 守护进程必须能够在守护进程åˆå§‹åŒ–时找到系 ç»Ÿæ˜ å°„æ–‡ä»¶ã€‚æœ‰å…³ ``klogd`` 如何æœç´¢æ˜ 射文件的信æ¯ï¼Œè¯·å‚è§klogd手册页。 å½“ä½¿ç”¨å†…æ ¸å¯åŠ è½½æ¨¡å—æ—¶ï¼ŒåЍæ€åœ°å€è½¬æ¢éžå¸¸é‡è¦ã€‚ç”±äºŽå†…æ ¸æ¨¡å—çš„å†…å˜æ˜¯ä»Žå†…æ ¸çš„ 动æ€å†…å˜æ± ä¸åˆ†é…çš„ï¼Œå› æ¤æ— 论是模å—的开头还是模å—ä¸çš„函数和符å·éƒ½æ²¡æœ‰å›ºå®šçš„ ä½ç½®ã€‚ å†…æ ¸æ”¯æŒç³»ç»Ÿè°ƒç”¨ï¼Œå…许程åºç¡®å®šåŠ è½½å“ªäº›æ¨¡å—åŠå…¶åœ¨å†…å˜ä¸çš„ä½ç½®ã€‚klogd守护进程 使用这些系统调用构建了一个符å·è¡¨ï¼Œå¯ç”¨äºŽè°ƒè¯•å¯åŠ è½½å†…æ ¸æ¨¡å—ä¸å‘ç”Ÿçš„ä¿æŠ¤é”™è¯¯ã€‚ klogd至少会æä¾›äº§ç”Ÿä¿æŠ¤æ•…障的模å—çš„å称。如果å¯åŠ è½½æ¨¡å—的开å‘äººå‘˜é€‰æ‹©ä»Žæ¨¡å— å¯¼å‡ºç¬¦å·ä¿¡æ¯ï¼Œåˆ™å¯èƒ½ä¼šæœ‰å…¶ä»–å¯ç”¨çš„符å·ä¿¡æ¯ã€‚ ç”±äºŽå†…æ ¸æ¨¡å—环境å¯ä»¥æ˜¯åЍæ€çš„ï¼Œå› æ¤å½“模å—环境å‘生å˜åŒ–时,必须有一ç§é€šçŸ¥ ``klogd`` 守护进程的机制。有一些å¯ç”¨çš„命令行选项å…许klogdå‘当剿£åœ¨æ‰§è¡Œçš„守 护进程å‘出信å·ç¤ºæ„应该刷新符å·ä¿¡æ¯ã€‚有关更多信æ¯ï¼Œè¯·å‚阅 ``klogd`` 手册页。 sysklogdå‘行版附带了一个补ä¸ï¼Œå®ƒä¿®æ”¹äº† ``modules-2.0.0`` åŒ…ï¼Œä»¥ä¾¿åœ¨åŠ è½½æˆ– å¸è½½æ¨¡å—时自动å‘klogdå‘é€ä¿¡å·ã€‚应用æ¤è¡¥ä¸åŸºæœ¬ä¸Šå¯æ— ç¼æ”¯æŒè°ƒè¯•å†…æ ¸å¯åŠ è½½æ¨¡å— å‘ç”Ÿçš„ä¿æŠ¤æ•…éšœã€‚ 以下是 ``klogd`` 处ç†çš„å¯åŠ è½½æ¨¡å—ä¸çš„ä¿æŠ¤æ•…éšœç¤ºä¾‹:: Aug 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