你好
我正在运行 bi-di
' iperf
' 使用我的驱动程序在接口(interface)上进行测试。
重现的步骤是运行 bi-di I/O
在一个接口(interface)上(其他接口(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()
有很多内联定义,因此不知何故不能完全反射(reflect)源文件中的流程。在这种情况下,将 0xdd 添加到 net_rx_action (say 32FF) => 340C
的基地址是否安全? .即340C
是导致崩溃的违规行号'kernel paging request error
'有关如何调试此问题的任何提示/建议都会有很大帮助
最佳答案
不幸的是,或者幸运的是,根据您的观点,通过高级别的优化,编译器可以创建调试格式无法将 C 代码行合理地映射到汇编指令的汇编代码。您会遇到什么类型的情况取决于编译器、优化级别、调试符号格式、调试符号级别和代码本身。
您必须假设通过这种技术获得的行号可能是错误的。话虽如此,我在自己的内核工作中经常使用这种技术,而且我还没有遇到任何问题(敲木头)。请记住,如果您遇到一些毫无意义的事情,您可能会有一个错误的行号。
关于networking - 在内核崩溃转储中确定源代码中的确切行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5400851/