你好
我正在使用驱动程序在接口(interface)上运行bi-di
'iperf
'测试。
要复制的步骤是在一个接口(interface)上运行bi-di I/O
(另一个接口(interface)未激活):
两个
崩溃不是在驱动程序中发生的,而是在'
iperf
'上下文中发生的。我要复制粘贴堆栈跟踪: PID: 8855 TASK: f7036550 CPU: 0 COMMAND: "iperf"
#0 [c074bed0] crash_kexec at c0443233
#1 [c074bf14] die at c04064d3
#2 [c074bf44] do_page_fault at c062134b
#3 [c074bf94] error_code (via page_fault) at c0405abb
EAX: f5888100 EBX: 00000000 ECX: 00100100 EDX: 00200200 EBP: 00000001
DS: 007b ESI: f5888000 ES: 007b EDI: cb614000
CS: 0060 EIP: c05c4e94 ERR: ffffffff EFLAGS: 00010046
#4 [c074bfc8] net_rx_action at c05c4e94
#5 [c074bfe4] __do_softirq at c042aa65
--- <soft IRQ> ---
#0 [f281ac4c] do_softirq at c04073e5
#1 [f281ac58] do_IRQ at c04074d9
#2 [f281ac70] common_interrupt at c0405975
EAX: 39383736 EBX: f281af4c ECX: 00000428 EDX: 31303938 EBP: f378b042
DS: 007b ESI: f378b1c2 ES: 007b EDI: 09fdb448
CS: 0060 EIP: c04f1c07 ERR: ffffffba EFLAGS: 00000202
#3 [f281aca4] __copy_to_user_ll at c04f1c07
#4 [f281acb0] memcpy_toiovec at c05bfecc
#5 [f281acc4] skb_copy_datagram_iovec at c05c059b
#6 [f281acf4] tcp_rcv_established at c05ef40a
#7 [f281ad20] tcp_v4_do_rcv at c05f48c5
#8 [f281ad54] tcp_prequeue_process at c05e6bdd
#9 [f281ad5c] tcp_recvmsg at c05e90e2
#10 [f281ad9c] sock_common_recvmsg at c05bb1c4
#11 [f281adc0] sock_recvmsg at c05b8dc6
#12 [f281aea0] sys_recvfrom at c05ba6ab
#13 [f281af64] sys_recv at c05ba727
#14 [f281af80] sys_socketcall at c05bab52
#15 [f281afb8] system_call at c0404f44
EAX: ffffffda EBX: 0000000a ECX: b6ba2340 EDX: 00014268
DS: 007b ESI: 00000000 ES: 007b EDI: 09fbe630
SS: 007b ESP: b6ba2328 EBP: b6ba2378
CS: 0073 EIP: 004ad410 ERR: 00000066 EFLAGS: 00000293
crash>
崩溃时的
EIP
是net_rx_action:0xdd/19ca
。现在,我已经编译了kernel-2.6.18-238 sources
(运行DUT的操作系统的源版本),并在'objdump -S ./net/core/dev.o > dev_o_dmp
上做了一个./net/core/dev.c
',它具有net_rx_acdtion
()的定义。现在,在“dev_o_dmp
”文件中,net_rx_action()
具有许多内联定义,因此某种程度上不能完全反映源文件中的流程。在这种情况下,将0xdd添加到net_rx_action (say 32FF) => 340C
的基本地址是安全的。即340C
是引起崩溃'kernel paging request error
'的有问题的行号。有关如何调试此问题的任何提示/建议将大有帮助
最佳答案
不幸的是,或者幸运的是,取决于您的观点,通过高度的优化,编译器可能会创建汇编代码,而调试格式无法将合理的C代码行映射到汇编指令。遇到此问题的情况类型取决于编译器,优化级别,调试符号格式,调试符号级别以及代码本身。
您必须假设通过此技术获得的行号可能是错误的。话虽这么说,我在自己的内核工作中经常使用这种技术,但是我还没有遇到任何问题(敲竹杠)。只要记住,如果您遇到毫无意义的问题,则可能会出现行号错误的情况。