Kernel

了解 dmesg 核心警告消息

  • February 25, 2019

我正在嘗試調試我的核心模組。當我執行它時,我收到以下核心警告,但似乎沒有像我見過的其他警告那樣提供資訊性消息。是否有可能從中獲得任何有用的資訊?


更多資訊:

該模組被稱為firewall,它將 tcp 數據包轉移到使用者空間中的代理伺服器,然後代理將接收到的 tcp 數據發送到預期的目的地。

這發生在通過簡單地接收一個套接字上的所有數據並在另一個套接字上呼叫 sendall 來處理 http 響應時。當所有響應都在一個數據包中時不會發生警告,但當 http 有效負載數據被分割成多個 tcp 數據包時會發生警告。

代理是用python編寫的。對我來說很奇怪,在警告中它說“python tainted”。使用者空間應用程序會導致核心警告嗎?


我嘗試只在代理中接收一個大文件但不發送它並且沒有收到任何錯誤,並且系統在任何時候都沒有凍結。問題僅發生在呼叫 socket.sendall/socket.send

減小讀取緩衝區大小然後發送更小的塊會導致系統更快地鎖定。

關閉兩者,gso防止錯誤消息,但係統在相同的時間後仍然鎖定,讓我想知道警告是否與鎖定有關tso``ethtool

[16795.153478] ------------[ cut here ]------------
[16795.153489] WARNING: at /build/buildd/linux-3.2.0/net/core/dev.c:1970 skb_gso_segment+0x2e9/0x360()
[16795.153492] Hardware name: VirtualBox
[16795.153495] e1000: caps=(0x40014b89, 0x401b4b89) len=2948 data_len=0 ip_summed=0
[16795.153497] Modules linked in: firewall(O) vesafb vboxsf(O) snd_intel8x0 snd_ac97_codec ac97_bus snd_pcm snd_seq_midi snd_rawmidi snd_seq_midi_event snd_seq snd_timer snd_seq_device joydev psmouse snd soundcore serio_raw i2c_piix4 snd_page_alloc vboxguest(O) video bnep mac_hid rfcomm bluetooth parport_pc ppdev lp parport usbhid hid e1000 [last unloaded: firewall]
[16795.153529] Pid: 7644, comm: python Tainted: G        W  O 3.2.0-37-generic-pae #58-Ubuntu
[16795.153532] Call Trace:
[16795.153540]  [<c105a822>] warn_slowpath_common+0x72/0xa0
[16795.153544]  [<c14ad2b9>] ? skb_gso_segment+0x2e9/0x360
[16795.153548]  [<c14ad2b9>] ? skb_gso_segment+0x2e9/0x360
[16795.153551]  [<c105a8f3>] warn_slowpath_fmt+0x33/0x40
[16795.153555]  [<c14ad2b9>] skb_gso_segment+0x2e9/0x360
[16795.153561]  [<c14b01ce>] dev_hard_start_xmit+0xae/0x4c0
[16795.153568]  [<f9a6f2fd>] ? divertPacket+0x7d/0xe0 [firewall]
[16795.153574]  [<c14c8151>] sch_direct_xmit+0xb1/0x180
[16795.153578]  [<f9a6f941>] ? hook_localout+0x71/0xe0 [firewall]
[16795.153582]  [<c14b06d6>] dev_queue_xmit+0xf6/0x370
[16795.153586]  [<c14c6459>] ? eth_header+0x29/0xc0
[16795.153590]  [<c14b73f0>] neigh_resolve_output+0x100/0x1c0
[16795.153594]  [<c14c6430>] ? eth_rebuild_header+0x80/0x80
[16795.153598]  [<c14dec62>] ip_finish_output+0x152/0x2e0
[16795.153602]  [<c14df75f>] ip_output+0xaf/0xc0
[16795.153605]  [<c14dd340>] ? ip_forward_options+0x1d0/0x1d0
[16795.153609]  [<c14deec0>] ip_local_out+0x20/0x30
[16795.153612]  [<c14defee>] ip_queue_xmit+0x11e/0x3c0
[16795.153617]  [<c10841c5>] ? getnstimeofday+0x55/0x120
[16795.153622]  [<c14f4de7>] tcp_transmit_skb+0x2d7/0x4a0
[16795.153626]  [<c14f5786>] tcp_write_xmit+0x146/0x3a0
[16795.153630]  [<c14f5a4c>] __tcp_push_pending_frames+0x2c/0x90
[16795.153634]  [<c14e7d2b>] tcp_sendmsg+0x71b/0xae0
[16795.153638]  [<c104a33d>] ? update_curr+0x1ed/0x360
[16795.153642]  [<c1509c23>] ? inet_recvmsg+0x73/0x90
[16795.153646]  [<c1509ca0>] inet_sendmsg+0x60/0xa0
[16795.153650]  [<c149ae27>] sock_sendmsg+0xf7/0x120
[16795.153655]  [<c1044648>] ? ttwu_do_wakeup+0x28/0x130
[16795.153660]  [<c1036a98>] ? default_spin_lock_flags+0x8/0x10
[16795.153667]  [<c149ce7e>] sys_sendto+0x10e/0x150
[16795.153672]  [<c1117e7f>] ? handle_pte_fault+0x28f/0x2c0
[16795.153675]  [<c111809e>] ? handle_mm_fault+0x15e/0x2c0
[16795.153679]  [<c15ab9c7>] ? do_page_fault+0x227/0x490
[16795.153681]  [<c149cefb>] sys_send+0x3b/0x40
[16795.153684]  [<c149d842>] sys_socketcall+0x162/0x2c0
[16795.153687]  [<c15af55f>] sysenter_do_call+0x12/0x28
[16795.153689] ---[ end trace 3170256120cbbc8f ]---

您是否嘗試過從堆棧跟踪的末尾向後跟隨addr2line

例如查看最後一行sysenter_do_call+0x12/0x28

它告訴我們偏移量是0x12,長度是0x28

$ addr2line -e [path-to-kernel-module-with-issue] 0xc15af55f

依此類推…gdb是將堆棧跟踪分解為行的另一種選擇。

但是,我不完全確定您是如何陷入核心恐慌的,因為我在您提供的日誌摘錄中看到的只是一個警告。在您發布堆棧跟踪後是否會導致崩潰/核心恐慌消息?

——–就發布的堆棧跟踪而言:它與一般分段解除安裝有關,skbuffer 對 ip_summed 校驗和不滿意,禁用 large\general 接收器解除安裝

$ethtool -k [NIC] lro off $ethtool -k [NIC] gro off

可能是一種可能的解決方法。此外,跳過校驗和檢查skb->ip_summed = CHECKSUM_UNNECESSARY也可能會解決此問題,具體取決於設置的目的。

引用自:https://unix.stackexchange.com/questions/502740