162306a36Sopenharmony_ci.. SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci.. include:: ../disclaimer-zh_TW.rst
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci:Original: :doc:`../../../admin-guide/bug-hunting`
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci:譯者:
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci 吳想成 Wu XiangCheng <bobwxc@email.cn>
1062306a36Sopenharmony_ci 胡皓文 Hu Haowen <src.res.211@gmail.com>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci追蹤缺陷
1362306a36Sopenharmony_ci=========
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci內核錯誤報告通常附帶如下堆棧轉儲::
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci	------------[ cut here ]------------
1862306a36Sopenharmony_ci	WARNING: CPU: 1 PID: 28102 at kernel/module.c:1108 module_put+0x57/0x70
1962306a36Sopenharmony_ci	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]
2062306a36Sopenharmony_ci	CPU: 1 PID: 28102 Comm: rmmod Tainted: P        WC O 4.8.4-build.1 #1
2162306a36Sopenharmony_ci	Hardware name: MSI MS-7309/MS-7309, BIOS V1.12 02/23/2009
2262306a36Sopenharmony_ci	 00000000 c12ba080 00000000 00000000 c103ed6a c1616014 00000001 00006dc6
2362306a36Sopenharmony_ci	 c1615862 00000454 c109e8a7 c109e8a7 00000009 ffffffff 00000000 f13f6a10
2462306a36Sopenharmony_ci	 f5f5a600 c103ee33 00000009 00000000 00000000 c109e8a7 f80ca4d0 c109f617
2562306a36Sopenharmony_ci	Call Trace:
2662306a36Sopenharmony_ci	 [<c12ba080>] ? dump_stack+0x44/0x64
2762306a36Sopenharmony_ci	 [<c103ed6a>] ? __warn+0xfa/0x120
2862306a36Sopenharmony_ci	 [<c109e8a7>] ? module_put+0x57/0x70
2962306a36Sopenharmony_ci	 [<c109e8a7>] ? module_put+0x57/0x70
3062306a36Sopenharmony_ci	 [<c103ee33>] ? warn_slowpath_null+0x23/0x30
3162306a36Sopenharmony_ci	 [<c109e8a7>] ? module_put+0x57/0x70
3262306a36Sopenharmony_ci	 [<f80ca4d0>] ? gp8psk_fe_set_frontend+0x460/0x460 [dvb_usb_gp8psk]
3362306a36Sopenharmony_ci	 [<c109f617>] ? symbol_put_addr+0x27/0x50
3462306a36Sopenharmony_ci	 [<f80bc9ca>] ? dvb_usb_adapter_frontend_exit+0x3a/0x70 [dvb_usb]
3562306a36Sopenharmony_ci	 [<f80bb3bf>] ? dvb_usb_exit+0x2f/0xd0 [dvb_usb]
3662306a36Sopenharmony_ci	 [<c13d03bc>] ? usb_disable_endpoint+0x7c/0xb0
3762306a36Sopenharmony_ci	 [<f80bb48a>] ? dvb_usb_device_exit+0x2a/0x50 [dvb_usb]
3862306a36Sopenharmony_ci	 [<c13d2882>] ? usb_unbind_interface+0x62/0x250
3962306a36Sopenharmony_ci	 [<c136b514>] ? __pm_runtime_idle+0x44/0x70
4062306a36Sopenharmony_ci	 [<c13620d8>] ? __device_release_driver+0x78/0x120
4162306a36Sopenharmony_ci	 [<c1362907>] ? driver_detach+0x87/0x90
4262306a36Sopenharmony_ci	 [<c1361c48>] ? bus_remove_driver+0x38/0x90
4362306a36Sopenharmony_ci	 [<c13d1c18>] ? usb_deregister+0x58/0xb0
4462306a36Sopenharmony_ci	 [<c109fbb0>] ? SyS_delete_module+0x130/0x1f0
4562306a36Sopenharmony_ci	 [<c1055654>] ? task_work_run+0x64/0x80
4662306a36Sopenharmony_ci	 [<c1000fa5>] ? exit_to_usermode_loop+0x85/0x90
4762306a36Sopenharmony_ci	 [<c10013f0>] ? do_fast_syscall_32+0x80/0x130
4862306a36Sopenharmony_ci	 [<c1549f43>] ? sysenter_past_esp+0x40/0x6a
4962306a36Sopenharmony_ci	---[ end trace 6ebc60ef3981792f ]---
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci這樣的堆棧跟蹤提供了足夠的信息來識別內核原始碼中發生錯誤的那一行。根據問題的
5262306a36Sopenharmony_ci嚴重性,它還可能包含 **「Oops」** 一詞,比如::
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	BUG: unable to handle kernel NULL pointer dereference at   (null)
5562306a36Sopenharmony_ci	IP: [<c06969d4>] iret_exc+0x7d0/0xa59
5662306a36Sopenharmony_ci	*pdpt = 000000002258a001 *pde = 0000000000000000
5762306a36Sopenharmony_ci	Oops: 0002 [#1] PREEMPT SMP
5862306a36Sopenharmony_ci	...
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci儘管有 **Oops** 或其他類型的堆棧跟蹤,但通常需要找到出問題的行來識別和處理缺
6162306a36Sopenharmony_ci陷。在本章中,我們將參考「Oops」來了解需要分析的各種堆棧跟蹤。
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci如果內核是用 ``CONFIG_DEBUG_INFO`` 編譯的,那麼可以使用文件:
6462306a36Sopenharmony_ci`scripts/decode_stacktrace.sh` 。
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci連結的模塊
6762306a36Sopenharmony_ci-----------
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci受到汙染或正在加載/卸載的模塊用「(…)」標記,汙染標誌在
7062306a36Sopenharmony_ci`Documentation/admin-guide/tainted-kernels.rst` 文件中進行了描述,「正在被加
7162306a36Sopenharmony_ci載」用「+」標註,「正在被卸載」用「-」標註。
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ciOops消息在哪?
7562306a36Sopenharmony_ci---------------
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci通常,Oops文本由klogd從內核緩衝區讀取,然後交給 ``syslogd`` ,後者將其寫入
7862306a36Sopenharmony_cisyslog文件,通常是 ``/var/log/messages`` (取決於 ``/etc/syslog.conf`` )。
7962306a36Sopenharmony_ci在使用systemd的系統上,它也可以由 ``journald`` 守護進程存儲,並通過運行
8062306a36Sopenharmony_ci``journalctl`` 命令進行訪問。
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci有時 ``klogd`` 會掛掉,這種情況下您可以運行 ``dmesg > file`` 從內核緩衝區
8362306a36Sopenharmony_ci讀取數據並保存它。或者您可以 ``cat /proc/kmsg > file`` ,但是您必須適時
8462306a36Sopenharmony_ci中斷以停止傳輸,因爲 ``kmsg`` 是一個「永無止境的文件」。
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci如果機器嚴重崩潰,無法輸入命令或磁碟不可用,那還有三個選項:
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci(1) 手動複製屏幕上的文本,並在機器重新啓動後輸入。很難受,但這是突然崩潰下
8962306a36Sopenharmony_ci    唯一的選擇。或者你可以用數位相機拍下屏幕——雖然不那麼好,但總比什麼都沒
9062306a36Sopenharmony_ci    有好。如果消息滾動超出控制台頂部,使用更高解析度(例如 ``vga=791`` )
9162306a36Sopenharmony_ci    引導啓動將允許您閱讀更多文本。(警告:這需要 ``vesafb`` ,因此對「早期」
9262306a36Sopenharmony_ci    的Oppses沒有幫助)
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci(2) 從串口終端啓動(參見
9562306a36Sopenharmony_ci    :ref:`Documentation/admin-guide/serial-console.rst <serial_console>` ),
9662306a36Sopenharmony_ci    在另一台機器上運行數據機然後用你喜歡的通信程序捕獲輸出。
9762306a36Sopenharmony_ci    Minicom運行良好。
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci(3) 使用Kdump(參閱 Documentation/admin-guide/kdump/kdump.rst ),使用
10062306a36Sopenharmony_ci    Documentation/admin-guide/kdump/gdbmacros.txt 中的dmesg gdbmacro從舊內存
10162306a36Sopenharmony_ci    中提取內核環形緩衝區。
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci找到缺陷位置
10462306a36Sopenharmony_ci-------------
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci如果你能指出缺陷在內核原始碼中的位置,則報告缺陷的效果會非常好。這有兩種方法。
10762306a36Sopenharmony_ci通常來說使用 ``gdb`` 會比較容易,不過內核需要用調試信息來預編譯。
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_cigdb
11062306a36Sopenharmony_ci^^^^
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ciGNU 調試器(GNU debugger, ``gdb`` )是從 ``vmlinux`` 文件中找出OOPS的確切
11362306a36Sopenharmony_ci文件和行號的最佳方法。
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci在使用 ``CONFIG_DEBUG_INFO`` 編譯的內核上使用gdb效果最好。可通過運行以下命令
11662306a36Sopenharmony_ci進行設置::
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci  $ ./scripts/config -d COMPILE_TEST -e DEBUG_KERNEL -e DEBUG_INFO
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci在用 ``CONFIG_DEBUG_INFO`` 編譯的內核上,你可以直接從OOPS複製EIP值::
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci EIP:    0060:[<c021e50e>]    Not tainted VLI
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci並使用GDB來將其翻譯成可讀形式::
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci  $ gdb vmlinux
12762306a36Sopenharmony_ci  (gdb) l *0xc021e50e
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci如果沒有啓用 ``CONFIG_DEBUG_INFO`` ,則使用OOPS的函數偏移::
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci EIP is at vt_ioctl+0xda8/0x1482
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci並在啓用 ``CONFIG_DEBUG_INFO`` 的情況下重新編譯內核::
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci  $ ./scripts/config -d COMPILE_TEST -e DEBUG_KERNEL -e DEBUG_INFO
13662306a36Sopenharmony_ci  $ make vmlinux
13762306a36Sopenharmony_ci  $ gdb vmlinux
13862306a36Sopenharmony_ci  (gdb) l *vt_ioctl+0xda8
13962306a36Sopenharmony_ci  0x1888 is in vt_ioctl (drivers/tty/vt/vt_ioctl.c:293).
14062306a36Sopenharmony_ci  288	{
14162306a36Sopenharmony_ci  289		struct vc_data *vc = NULL;
14262306a36Sopenharmony_ci  290		int ret = 0;
14362306a36Sopenharmony_ci  291
14462306a36Sopenharmony_ci  292		console_lock();
14562306a36Sopenharmony_ci  293		if (VT_BUSY(vc_num))
14662306a36Sopenharmony_ci  294			ret = -EBUSY;
14762306a36Sopenharmony_ci  295		else if (vc_num)
14862306a36Sopenharmony_ci  296			vc = vc_deallocate(vc_num);
14962306a36Sopenharmony_ci  297		console_unlock();
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci或者若您想要更詳細的顯示::
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci  (gdb) p vt_ioctl
15462306a36Sopenharmony_ci  $1 = {int (struct tty_struct *, unsigned int, unsigned long)} 0xae0 <vt_ioctl>
15562306a36Sopenharmony_ci  (gdb) l *0xae0+0xda8
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci您也可以使用對象文件作爲替代::
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ci  $ make drivers/tty/
16062306a36Sopenharmony_ci  $ gdb drivers/tty/vt/vt_ioctl.o
16162306a36Sopenharmony_ci  (gdb) l *vt_ioctl+0xda8
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ci如果你有調用跟蹤,類似::
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci     Call Trace:
16662306a36Sopenharmony_ci      [<ffffffff8802c8e9>] :jbd:log_wait_commit+0xa3/0xf5
16762306a36Sopenharmony_ci      [<ffffffff810482d9>] autoremove_wake_function+0x0/0x2e
16862306a36Sopenharmony_ci      [<ffffffff8802770b>] :jbd:journal_stop+0x1be/0x1ee
16962306a36Sopenharmony_ci      ...
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci這表明問題可能在 :jbd: 模塊中。您可以在gdb中加載該模塊並列出相關代碼::
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci  $ gdb fs/jbd/jbd.ko
17462306a36Sopenharmony_ci  (gdb) l *log_wait_commit+0xa3
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ci.. note::
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci     您還可以對堆棧跟蹤處的任何函數調用執行相同的操作,例如::
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_ci	 [<f80bc9ca>] ? dvb_usb_adapter_frontend_exit+0x3a/0x70 [dvb_usb]
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci     上述調用發生的位置可以通過以下方式看到::
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_ci	$ gdb drivers/media/usb/dvb-usb/dvb-usb.o
18562306a36Sopenharmony_ci	(gdb) l *dvb_usb_adapter_frontend_exit+0x3a
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ciobjdump
18862306a36Sopenharmony_ci^^^^^^^^
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ci要調試內核,請使用objdump並從崩潰輸出中查找十六進位偏移,以找到有效的代碼/匯
19162306a36Sopenharmony_ci編行。如果沒有調試符號,您將看到所示例程的彙編程序代碼,但是如果內核有調試
19262306a36Sopenharmony_ci符號,C代碼也將可見(調試符號可以在內核配置菜單的hacking項中啓用)。例如::
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci    $ objdump -r -S -l --disassemble net/dccp/ipv4.o
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_ci.. note::
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_ci   您需要處於內核樹的頂層以便此獲得您的C文件。
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ci如果您無法訪問原始碼,仍然可以使用以下方法調試一些崩潰轉儲(如Dave Miller的
20162306a36Sopenharmony_ci示例崩潰轉儲輸出所示)::
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_ci     EIP is at 	+0x14/0x4c0
20462306a36Sopenharmony_ci      ...
20562306a36Sopenharmony_ci     Code: 44 24 04 e8 6f 05 00 00 e9 e8 fe ff ff 8d 76 00 8d bc 27 00 00
20662306a36Sopenharmony_ci     00 00 55 57  56 53 81 ec bc 00 00 00 8b ac 24 d0 00 00 00 8b 5d 08
20762306a36Sopenharmony_ci     <8b> 83 3c 01 00 00 89 44  24 14 8b 45 28 85 c0 89 44 24 18 0f 85
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_ci     Put the bytes into a "foo.s" file like this:
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ci            .text
21262306a36Sopenharmony_ci            .globl foo
21362306a36Sopenharmony_ci     foo:
21462306a36Sopenharmony_ci            .byte  .... /* bytes from Code: part of OOPS dump */
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ci     Compile it with "gcc -c -o foo.o foo.s" then look at the output of
21762306a36Sopenharmony_ci     "objdump --disassemble foo.o".
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_ci     Output:
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci     ip_queue_xmit:
22262306a36Sopenharmony_ci         push       %ebp
22362306a36Sopenharmony_ci         push       %edi
22462306a36Sopenharmony_ci         push       %esi
22562306a36Sopenharmony_ci         push       %ebx
22662306a36Sopenharmony_ci         sub        $0xbc, %esp
22762306a36Sopenharmony_ci         mov        0xd0(%esp), %ebp        ! %ebp = arg0 (skb)
22862306a36Sopenharmony_ci         mov        0x8(%ebp), %ebx         ! %ebx = skb->sk
22962306a36Sopenharmony_ci         mov        0x13c(%ebx), %eax       ! %eax = inet_sk(sk)->opt
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_ci`scripts/decodecode` 文件可以用來自動完成大部分工作,這取決於正在調試的CPU
23262306a36Sopenharmony_ci體系結構。
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_ci報告缺陷
23562306a36Sopenharmony_ci---------
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ci一旦你通過定位缺陷找到了其發生的地方,你可以嘗試自己修復它或者向上游報告它。
23862306a36Sopenharmony_ci
23962306a36Sopenharmony_ci爲了向上游報告,您應該找出用於開發受影響代碼的郵件列表。這可以使用 ``get_maintainer.pl`` 。
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_ci例如,您在gspca的sonixj.c文件中發現一個缺陷,則可以通過以下方法找到它的維護者::
24362306a36Sopenharmony_ci
24462306a36Sopenharmony_ci	$ ./scripts/get_maintainer.pl -f drivers/media/usb/gspca/sonixj.c
24562306a36Sopenharmony_ci	Hans Verkuil <hverkuil@xs4all.nl> (odd fixer:GSPCA USB WEBCAM DRIVER,commit_signer:1/1=100%)
24662306a36Sopenharmony_ci	Mauro Carvalho Chehab <mchehab@kernel.org> (maintainer:MEDIA INPUT INFRASTRUCTURE (V4L/DVB),commit_signer:1/1=100%)
24762306a36Sopenharmony_ci	Tejun Heo <tj@kernel.org> (commit_signer:1/1=100%)
24862306a36Sopenharmony_ci	Bhaktipriya Shridhar <bhaktipriya96@gmail.com> (commit_signer:1/1=100%,authored:1/1=100%,added_lines:4/4=100%,removed_lines:9/9=100%)
24962306a36Sopenharmony_ci	linux-media@vger.kernel.org (open list:GSPCA USB WEBCAM DRIVER)
25062306a36Sopenharmony_ci	linux-kernel@vger.kernel.org (open list)
25162306a36Sopenharmony_ci
25262306a36Sopenharmony_ci請注意它將指出:
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ci- 最後接觸原始碼的開發人員(如果這是在git樹中完成的)。在上面的例子中是Tejun
25562306a36Sopenharmony_ci  和Bhaktipriya(在這個特定的案例中,沒有人真正參與這個文件的開發);
25662306a36Sopenharmony_ci- 驅動維護人員(Hans Verkuil);
25762306a36Sopenharmony_ci- 子系統維護人員(Mauro Carvalho Chehab);
25862306a36Sopenharmony_ci- 驅動程序和/或子系統郵件列表(linux-media@vger.kernel.org);
25962306a36Sopenharmony_ci- Linux內核郵件列表(linux-kernel@vger.kernel.org)。
26062306a36Sopenharmony_ci
26162306a36Sopenharmony_ci通常,修復缺陷的最快方法是將它報告給用於開發相關代碼的郵件列表(linux-media
26262306a36Sopenharmony_ciML),抄送驅動程序維護者(Hans)。
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_ci如果你完全不知道該把報告寄給誰,且 ``get_maintainer.pl`` 也沒有提供任何有用
26562306a36Sopenharmony_ci的信息,請發送到linux-kernel@vger.kernel.org。
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_ci感謝您的幫助,這使Linux儘可能穩定:-)
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_ci修復缺陷
27062306a36Sopenharmony_ci---------
27162306a36Sopenharmony_ci
27262306a36Sopenharmony_ci如果你懂得編程,你不僅可以通過報告錯誤來幫助我們,還可以提供一個解決方案。
27362306a36Sopenharmony_ci畢竟,開源就是分享你的工作,你不想因爲你的天才而被認可嗎?
27462306a36Sopenharmony_ci
27562306a36Sopenharmony_ci如果你決定這樣做,請在制定解決方案後將其提交到上游。
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_ci請務必閱讀
27862306a36Sopenharmony_ci:ref:`Documentation/process/submitting-patches.rst <submittingpatches>` ,
27962306a36Sopenharmony_ci以幫助您的代碼被接受。
28062306a36Sopenharmony_ci
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_ci---------------------------------------------------------------------------
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_ci用 ``klogd`` 進行Oops跟蹤的注意事項
28562306a36Sopenharmony_ci------------------------------------
28662306a36Sopenharmony_ci
28762306a36Sopenharmony_ci爲了幫助Linus和其他內核開發人員, ``klogd`` 對保護故障的處理提供了大量支持。
28862306a36Sopenharmony_ci爲了完整支持地址解析,至少應該使用 ``sysklogd`` 包的1.3-pl3版本。
28962306a36Sopenharmony_ci
29062306a36Sopenharmony_ci當發生保護故障時, ``klogd`` 守護進程會自動將內核日誌消息中的重要地址轉換爲
29162306a36Sopenharmony_ci它們的等效符號。然後通過 ``klogd`` 使用的任何報告機制來轉發這個已翻譯的內核
29262306a36Sopenharmony_ci消息。保護錯誤消息可以直接從消息文件中剪切出來並轉發給內核開發人員。
29362306a36Sopenharmony_ci
29462306a36Sopenharmony_ci``klogd`` 執行兩種類型的地址解析,靜態翻譯和動態翻譯。靜態翻譯使用System.map
29562306a36Sopenharmony_ci文件。爲了進行靜態轉換, ``klogd`` 守護進程必須能夠在守護進程初始化時找到系
29662306a36Sopenharmony_ci統映射文件。有關 ``klogd`` 如何搜索映射文件的信息,請參見klogd手冊頁。
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_ci當使用內核可加載模塊時,動態地址轉換非常重要。由於內核模塊的內存是從內核的
29962306a36Sopenharmony_ci動態內存池中分配的,因此無論是模塊的開頭還是模塊中的函數和符號都沒有固定的
30062306a36Sopenharmony_ci位置。
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci內核支持系統調用,允許程序確定加載哪些模塊及其在內存中的位置。klogd守護進程
30362306a36Sopenharmony_ci使用這些系統調用構建了一個符號表,可用於調試可加載內核模塊中發生的保護錯誤。
30462306a36Sopenharmony_ci
30562306a36Sopenharmony_ciklogd至少會提供產生保護故障的模塊的名稱。如果可加載模塊的開發人員選擇從模塊
30662306a36Sopenharmony_ci導出符號信息,則可能會有其他可用的符號信息。
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_ci由於內核模塊環境可以是動態的,因此當模塊環境發生變化時,必須有一種通知
30962306a36Sopenharmony_ci``klogd`` 守護進程的機制。有一些可用的命令行選項允許klogd向當前正在執行的守
31062306a36Sopenharmony_ci護進程發出信號示意應該刷新符號信息。有關更多信息,請參閱 ``klogd`` 手冊頁。
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_cisysklogd發行版附帶了一個補丁,它修改了 ``modules-2.0.0`` 包,以便在加載或
31362306a36Sopenharmony_ci卸載模塊時自動向klogd發送信號。應用此補丁基本上可無縫支持調試內核可加載模塊
31462306a36Sopenharmony_ci發生的保護故障。
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_ci以下是 ``klogd`` 處理的可加載模塊中的保護故障示例::
31762306a36Sopenharmony_ci
31862306a36Sopenharmony_ci	Aug 29 09:51:01 blizard kernel: Unable to handle kernel paging request at virtual address f15e97cc
31962306a36Sopenharmony_ci	Aug 29 09:51:01 blizard kernel: current->tss.cr3 = 0062d000, %cr3 = 0062d000
32062306a36Sopenharmony_ci	Aug 29 09:51:01 blizard kernel: *pde = 00000000
32162306a36Sopenharmony_ci	Aug 29 09:51:01 blizard kernel: Oops: 0002
32262306a36Sopenharmony_ci	Aug 29 09:51:01 blizard kernel: CPU:    0
32362306a36Sopenharmony_ci	Aug 29 09:51:01 blizard kernel: EIP:    0010:[oops:_oops+16/3868]
32462306a36Sopenharmony_ci	Aug 29 09:51:01 blizard kernel: EFLAGS: 00010212
32562306a36Sopenharmony_ci	Aug 29 09:51:01 blizard kernel: eax: 315e97cc   ebx: 003a6f80   ecx: 001be77b   edx: 00237c0c
32662306a36Sopenharmony_ci	Aug 29 09:51:01 blizard kernel: esi: 00000000   edi: bffffdb3   ebp: 00589f90   esp: 00589f8c
32762306a36Sopenharmony_ci	Aug 29 09:51:01 blizard kernel: ds: 0018   es: 0018   fs: 002b   gs: 002b   ss: 0018
32862306a36Sopenharmony_ci	Aug 29 09:51:01 blizard kernel: Process oops_test (pid: 3374, process nr: 21, stackpage=00589000)
32962306a36Sopenharmony_ci	Aug 29 09:51:01 blizard kernel: Stack: 315e97cc 00589f98 0100b0b4 bffffed4 0012e38e 00240c64 003a6f80 00000001
33062306a36Sopenharmony_ci	Aug 29 09:51:01 blizard kernel:        00000000 00237810 bfffff00 0010a7fa 00000003 00000001 00000000 bfffff00
33162306a36Sopenharmony_ci	Aug 29 09:51:01 blizard kernel:        bffffdb3 bffffed4 ffffffda 0000002b 0007002b 0000002b 0000002b 00000036
33262306a36Sopenharmony_ci	Aug 29 09:51:01 blizard kernel: Call Trace: [oops:_oops_ioctl+48/80] [_sys_ioctl+254/272] [_system_call+82/128]
33362306a36Sopenharmony_ci	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
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ci---------------------------------------------------------------------------
33662306a36Sopenharmony_ci
33762306a36Sopenharmony_ci::
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_ci  Dr. G.W. Wettstein           Oncology Research Div. Computing Facility
34062306a36Sopenharmony_ci  Roger Maris Cancer Center    INTERNET: greg@wind.rmcc.com
34162306a36Sopenharmony_ci  820 4th St. N.
34262306a36Sopenharmony_ci  Fargo, ND  58122
34362306a36Sopenharmony_ci  Phone: 701-234-7556
34462306a36Sopenharmony_ci
345