커널 모듈을 디버깅하려고 합니다. 실행하면 다음과 같은 커널 경고가 표시되지만, 내가 본 다른 경고와 같은 정보 메시지는 없는 것 같습니다. 이것으로부터 유용한 정보를 얻을 수 있습니까?
추가 정보:
이 모듈은 firewall
tcp 패킷을 사용자 공간의 프록시 서버로 전송한 다음 프록시는 수신한 tcp 데이터를 의도한 대상으로 보냅니다.
이는 단순히 한 소켓에서 모든 데이터를 수신하고 다른 소켓에서 sendall을 호출하여 http 응답이 처리될 때 발생합니다. 모든 응답이 하나의 패킷에 있으면 경고가 발생하지 않지만 http 페이로드 데이터가 여러 tcp 패킷으로 조각화되면 경고가 발생합니다.
에이전트는 Python으로 작성되었습니다. 내가 이상하다고 생각하는 것은 경고에 "python tainted"라고 적혀 있다는 것입니다. 사용자 공간 애플리케이션으로 인해 커널 경고가 발생할 수 있나요?
프록시에서 대용량 파일을 수신하려고 시도했지만 전송하지 않았는데 오류가 발생하지 않았고 시스템이 언제든지 정지되지 않았습니다. 문제는 소켓.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 ]---
답변1
스택 추적의 끝부터 역추적해 보셨나요 addr2line
?
예를 들어 마지막 줄을 봅니다.sysenter_do_call+0x12/0x28
0x12
오프셋은 이고 길이는 다음과 같습니다 .0x28
$ addr2line -e [path-to-kernel-module-with-issue] 0xc15af55f
잠깐... gdb
은 스택 추적을 여러 줄로 나누는 또 다른 옵션입니다.
그러나 귀하가 제공한 로그 발췌에서 제가 본 것은 경고뿐이므로 어떻게 커널 패닉이 발생했는지 완전히 확신할 수 없습니다. 스택 추적을 게시한 후 충돌/커널 패닉 메시지가 발생합니까?
-------- 스택 추적이 게시된 한: 이는 일반 분할 오프로딩과 관련이 있으며 skbuffer는 ip_summed 체크섬을 만족하지 않으므로 대형\일반 수신기 오프로딩이 비활성화됩니다.
$ethtool -k [NIC] lro off
$ethtool -k [NIC] gro off
가능한 해결 방법이 될 수 있습니다. 또한 skb->ip_summed = CHECKSUM_UNNECESSARY
설정 목적에 따라 체크섬 확인을 건너뛰어도 이 문제가 해결될 수도 있습니다.