networking - 在内核崩溃转储中确定源代码中的确切行

标签 networking crash kernel

你好
我正在运行 bi-di ' iperf ' 使用我的驱动程序在接口(interface)上进行测试。
重现的步骤是运行 bi-di I/O在一个接口(interface)上(其他接口(interface)未激活):

  • 在 DUT
  • 上运行 iperf -c -P 8 -t 100000 -I 10
  • iperf -c 几乎立即从对等方获得与上述相同的参数(在上述“iperf 发送”的第 1 个 10 秒结束后)
    在两个
  • 上使用“iperf -s -w 256K”

    崩溃不是在驱动程序中发生,而是在“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/

    相关文章:

    linux - schedule() 什么时候返回?

    在为内核编码时可以使用 stdio 吗?

    java - 将 Java 程序从 UDP 切换到 TCP 的最简单方法是什么?

    sockets - 如果消息发布(启用确认)到具有免费消费者的队列,RabbitMQ 是否会保证交付?

    linux - ldirectord 在真实服务器死机时不传输连接

    memory - 可能的内存问题导致 Hbase Thrift 服务器崩溃

    macos - 在另一台Mac上打开后,我构建的任何Mac应用(osx)都会立即崩溃

    c - 单链表的段错误

    ubuntu - SPL(二级程序加载器)有什么用

    networking - 使用特定地址/接口(interface)拨号?戈朗