Linux内存踩踏问题分析方法

unable to handle kernel paging request at virtual address之类的问题有可能是內存越界导致该指针所在内存被破坏了或者可能踩到use after free 的内存。可以使用打开kasan以及slub的一些宏去分析。

202<1>.(1)[2801:kworker/u8:0]Unable to handle kernel paging request at virtual address 4ca519894b81866e
345687.217558] <1>.(1)[2801:kworker/u8:0]Mem abort info:
[345687.218222] <1>.(1)[2801:kworker/u8:0] ESR = 0x96000004
[2022-08-02_11:46:10.607][345687.218916] <1>.(1)[2801:kworker/u8:0] Exception class = DABT (current EL), IL = 32 bits
[2022-08-02_11:46:10.607][345687.219973] <1>.(1)[2801:kworker/u8:0] SET = 0, FnV = 0
[2022-08-02_11:46:10.608][345687.220667] <1>.(1)[2801:kworker/u8:0] EA = 0, S1PTW = 0
[2022-08-02_11:46:10.610][345687.221425] <1>.(1)[2801:kworker/u8:0]Data abort info:
[2022-08-02_11:46:10.611][345687.221495] <1>-(3)[0:swapper/3][name:bc&]tick broadcast enter counter cpu: 595, 61, 420, 396, success counter cpu: 67, 15, 94, 78, fail counter cpu: 0, 0, 0, 0, interrupt counter cpu: 129, 29, 186, 156, o: , p: , f: , t: 345687220000000, 345687220000000, 345687220000000, 345687220000000,
[2022-08-02_11:46:10.615][345687.225359] <1>.(1)[2801:kworker/u8:0] ISV = 0, ISS = 0x00000004
[2022-08-02_11:46:10.615][345687.226151] <1>.(1)[2801:kworker/u8:0] CM = 0, WnR = 0
[2022-08-02_11:46:10.636][345687.226834] <1>.(1)[2801:kworker/u8:0][4ca519894b81866e] address between user and kernel address ranges
[2022-08-02_11:46:10.637][345687.228047] <1>-(1)[2801:kworker/u8:0]Internal error: Oops: 96000004 [#1] SMP
[2022-08-02_11:46:11.626][345688.238547] <1>-(1)[2801:kworker/u8:0]Kernel Offset: 0x0 from 0xffffff8008000000
[2022-08-02_11:46:11.629][345688.239522] <1>-(1)[2801:kworker/u8:0]PHYS_OFFSET: 0x40000000
...
[2022-08-02_11:46:11.736][345688.345248] <1>-(1)[2801:kworker/u8:0]CPU: 1 PID: 2801 Comm: kworker/u8:0 Tainted: G O 4.19.205 #0
[2022-08-02_11:46:11.739][345688.346569] <1>-(1)[2801:kworker/u8:0]Hardware name: 
[2022-08-02_11:46:11.739][345688.347626] <1>-(1)[2801:kworker/u8:0]Workqueue: uether process_rx_w
[2022-08-02_11:46:11.739][345688.348456] <1>-(1)[2801:kworker/u8:0]pstate: 20c00005 (nzCv daif +PAN +UAO)
[2022-08-02_11:46:11.739][345688.349374] <1>-(1)[2801:kworker/u8:0]pc : skb_release_data+0x68/0x128
[2022-08-02_11:46:11.739][345688.350223] <1>-(1)[2801:kworker/u8:0]lr : skb_release_data+0x1c/0x128
[2022-08-02_11:46:11.739][345688.351069] <1>-(1)[2801:kworker/u8:0]sp : ffffff800ad6b270
[2022-08-02_11:46:11.739][345688.351796] <1>-(1)[2801:kworker/u8:0]x29: ffffff800ad6b270 x28: 0000000000480020
[2022-08-02_11:46:11.742][345688.352778] <1>-(1)[2801:kworker/u8:0]x27: ffffff800ad6bb00 x26: 0000000000000000
[2022-08-02_11:46:11.742][345688.353760] <1>-(1)[2801:kworker/u8:0]x25: ffffffc00b6f807c x24: ffffffc01f89682c
[2022-08-02_11:46:11.742][345688.354743] <1>-(1)[2801:kworker/u8:0]x23: ffffff8009703300 x22: ffffffffffffffea
[2022-08-02_11:46:11.744][345688.355725] <1>-(1)[2801:kworker/u8:0]x21: 0000000000000000 x20: ffffffc00b6fbec0
[2022-08-02_11:46:11.744][345688.356707] <1>-(1)[2801:kworker/u8:0]x19: ffffffc01f896800 x18: 0000000000000000
[2022-08-02_11:46:11.744][345688.357688] <1>-(1)[2801:kworker/u8:0]x17: 0000000000000000 x16: 0000000000000000
[2022-08-02_11:46:11.747][345688.358670] <1>-(1)[2801:kworker/u8:0]x15: 0000000000000000 x14: 8
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要判断是否发生了内存踩踏,可以通过以下步骤进行代码判断: 1. 监控页面交换次数和页面缺失次数:使用内核提供的相关接口,例如 `/proc/vmstat` 和 `/proc/pid/status`,获取系统的页面交换次数和进程的页面缺失次数。 2. 设置阈值:根据经验和系统特点,设置适当的阈值来判断是否发生了内存踩踏。阈值可以根据页面交换次数、页面缺失次数或其它相关指标进行设定。你可以先进行一些基准测试,观察系统在正常情况下的页面交换和页面缺失情况,然后根据这些数据设定阈值。 3. 判断逻辑:根据阈值和观察到的页面交换次数、页面缺失次数,编写判断逻辑来确定是否发生了内存踩踏。例如,如果页面交换次数持续增加,并且超过了设定的阈值,或者页面缺失次数超过了阈值,则可以判断发生了内存踩踏。 以下是一个简单的示例代码,用于判断是否发生了内存踩踏: ```c #include <stdio.h> // 函数用于判断是否发生了内存踩踏 int detect_memory_thrashing(unsigned long swap_count, unsigned long page_faults) { unsigned long swap_threshold = 1000; // 页面交换次数阈值 unsigned long page_fault_threshold = 10000; // 页面缺失次数阈值 // 判断页面交换次数和页面缺失次数是否超过阈值 if (swap_count > swap_threshold || page_faults > page_fault_threshold) { return 1; // 发生了内存踩踏 } else { return 0; // 没有发生内存踩踏 } } int main() { unsigned long swap_count = 0; // 页面交换次数 unsigned long page_faults = 0; // 页面缺失次数 // 获取页面交换次数和页面缺失次数的值 // 这里假设使用某些方法获取到了这两个值 // ... // 调用判断函数判断是否发生了内存踩踏 int is_thrashing = detect_memory_thrashing(swap_count, page_faults); if (is_thrashing) { printf("Memory thrashing detected!\n"); } else { printf("No memory thrashing detected.\n"); } return 0; } ``` 上述代码示例中,我们首先定义了页面交换次数阈值和页面缺失次数阈值。然后,我们编写了 `detect_memory_thrashing()` 函数,用于判断是否发生了内存踩踏。在 `main()` 函数中,我们通过某种方式获取了页面交换次数和页面缺失次数的值,并调用 `detect_memory_thrashing()` 函数进行判断。最后,根据判断结果输出相应的信息。 请注意,这只是一个简单的示例代码,实际情况可能更加复杂。你需要根据自己的需求和系统特点,调整阈值和判断逻辑,并根据实际情况获取页面交换次数和页面缺失次数的值。此外,你可能需要结合更多的监控数据和指标来进行综合判断,以准确地确定是否发生了内存踩踏

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

a2591748032-随心所记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值