首先给出内核的打印信息,串口会有一些,dmesg看的会全一些。

BUG: Bad page map in process XXX pte:800000036fae6227 pmd:35be8c067
addr:00007f3fa75c0000 vm_flags:00200070 anon_vma:(null) mapping:(null) index:7f3fa75c0
Pid: 1312, comm: XXX Not tainted 2.6.32.27 #1
Call Trace:[<ffffffff815a3570>] print_bad_pte+0x1e2/0x1fb[<ffffffff811063ee>] vm_normal_page+0x6e/0x80[<ffffffff81107117>] unmap_vmas+0x5b7/0x9f0[<ffffffff8106edba>] ? dequeue_signal+0xda/0x170[<ffffffff8110cb5c>] unmap_region+0xcc/0x170[<ffffffff8110e405>] do_munmap+0x305/0x3a0[<ffffffff8110f183>] sys_munmap+0x53/0x80[<ffffffff8100c082>] system_call_fastpath+0x16/0x1b
Disabling lock debugging due to kernel taint

堆栈中的内核版本号不必关注,因为换成3.16.44的内核也会出现这个问题。

这个堆栈似乎提供了很多的信息,可是对于定位问题,没有太多的帮助,并且一度诱导了错误了方向。

堆栈分析:这个堆栈明显是一个系统调用,系统调用的接口函数为munmap(),在程序代码中搜索,只找到几处,分析代码好像看不出什么问题。于是在进程中挂断点,由于堆栈每次都出现在业务线程,所以将所有的业务线程在munmap()挂上断点:break munmap thread idx,然后break munmap thread idy … ,触发断点,不是每次触发断点都会出现堆栈的,触发几次后才会出现。这个现象开始怀疑是内核的内存出现问题了。直到设了一个display *(0x00007f3fa75c0000),每次munmap()断点触发,都会试图读取 *(0x00007f3fa75c0000)的值,在某一次中断触发后,直接打印了上述堆栈(没有设置display前都是continue然后munmap()触发打印的),更确定是内核内存出问题了。

本着首先相信内核,怀疑自己的心态,首先定位驱动的问题,首先想到的是netmap驱动。查看进程XXX的内存映射:cat /proc/1312/maps

...
7f4020021000 default
7f40275c0000 default file=/dev/Vnetmap
7f40a8000000 default anon=3 dirty=3 N0=3
7f40a8021000 default
...

有没有惊奇的发现0x7f40275c0000 - 0x00007f3fa75c0000 = 0x80000000,也就是netmap的映射地址减去出问题的映射地址(就是上边display的那个)等于2G。每次都这么准。一脸懵逼,想着这事内核啥机制导致的,于是走读了一下内核内存管理的代码,重点关注了一下mmap()系统调用的流程。大概先屡一下思路。mmap()系统调用的流程简单如下:

do_mmap_pgoff||--get_unmapped_area|--...|--mmap_region||--find_vma_repare|--...|--file->f_op->mmap|--...

上边的file->f_op->mmap是特定与文件的函数,还记的上边的设备文件/dev/Vnetmap当用户程序打开它,并把它的文件描述符fd给了mmap()后就可调到Vnetmap自定义的file->f_op->mmap了。他是在Vnetmap驱动中实现,问题就是出在这里了。

分析:运行环境为64位X86平台。Vnetmap是驱动模块,运行在内核态,它将内核中申请的内存一点点映射到用户虚拟地址空间。它使用了一个int类型的变量作为虚拟地址偏移的累计计数,在偏移超过2G之后,int发生符号翻转变成负数了,偏移就变成-2G,这似乎就跟上边联系起来了。

理解:(这部分没跟源码,纯分析仅供说服自己,其实是没有太多时间了,还要干别的,有时间再分析吧)超出2G的内核空间内存,实际跟页表关联(错误关联),但在页面的区域(eara)中不可见,发生错误关联的用户态空间被重新分配时,发现页表意见被关联到页框,打印上述错误。


Contact: bigjordon@163.com

BUG: Bad page map in process XXX pte:800000036fae6227 pmd:35be8c067相关推荐

  1. failed to get the task for process XXX(解决方案)

    引人: iOS真机调试程序,报如下错误信息: failed to get the task for process XXX 原因: 证书问题,project和targets的证书都必须是开发证书,AD ...

  2. userdel: user xxx is currently used by process xxx 解决方案

    当我们想删除某个用户的时候,出现 user xxx is currently used by process xxx,可能的原因是你创建用户user1之后,使用su命令切换到user1用户下,之后又想 ...

  3. 【疑难教程】视频上云服务平台EasyCVR使用Go语言可执行程序出现“Process XXX has exited with status XXXX”错误

    GO语言在TSINGSEE青犀视频研发中起到了至关重要的作用,比如在开发 EasyCVR 的部分功能过程中,需要使用调用 C/C++ 的代码,一般采用 Cgo 的方式.当运行生成的可执行程序时,出现以 ...

  4. linux删除用户出现user xxx is currently used by process xxx的解决方案

    linux删除用户出现user xxx is currently used by process xxx的解决方案 当我们想要删除或更改某个用户名时发现user xxx is currently us ...

  5. Linux中使用userdel命令删除用户时出现错误 “userdel: user XXX is currently used by process XXX”*

    Linux中使用userdel命令删除用户时出现错误 "userdel: user XXX is currently used by process XXX" [root@loca ...

  6. 用 LSN 画个 PAGE MAP

    * GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 想法从何而来 获得雨果奖的科幻小说<三体>中出现了一个流行词汇:降维打击.更高维度文明对较低维度文明的打击 ...

  7. Cannot set priority of nodemanager process xxx问题

    Cannot set priority of nodemanager process xxx问题 一.问题描述 这个问题是我在配置hadoop集群时遇到的问题,启动resourcemanager和no ...

  8. Kernel Page Global Directory (PGD) of Page table of Process created in Linux Kernel

    Kernel Page Global Directory (PGD) of User process created 在早期版本: 在fork一个进程的时候,必须建立进程自己的内核页目录项(内核页目录 ...

  9. Inferior 1 (process xxx) exited with code 0177

    今天调试的时候遇到个很奇怪的问题,我的服务是多进程的,每次收到请求子进程就退出了,然后又重新被父进程拉起一个新的子进程,看了下core目录也没有生成core文件. 通过日志看到当前执行到了哪里,在后面 ...

  10. Android 开机Process xxx (pid xxxx) has died问题分析

    系统中有一个监听BOOT_COMPLETED广播的自启应用,概率性出现启动后被kill掉的现象.Log如下: 08-12 16:48:40.453 773 908 I ActivityManager: ...

最新文章

  1. android ip 黑白名单,GaussDB T 单机 IP黑白名单配置
  2. C++ 异常机制分析
  3. hdu1874 畅通工程续
  4. 简单判断用户重复登录,记录一下
  5. 【转】centos安装vim7.4(转)
  6. fg jobs bg
  7. sobel算子实现边缘检测及其c++实现及与matlab效果对比
  8. 幻塔html5,《幻塔》捏脸系统怎么玩 捏脸系统玩法分享
  9. python--图像分割GraphCut
  10. sam音高修正_Melodyneplugin音高修正插件使用入门(精)
  11. 计算机出现函数不正确的是,小编教你快速修复无法访问函数不正确的方法
  12. 日记侠:如何提高朋友圈活跃度,给你5种实用方法
  13. xxl-job任务调度平台发送报警邮件
  14. 雷允上药业百年老店回春
  15. vimdiff常用命令详解
  16. python文本文件对比_Python-文件差异对比
  17. 干货来袭:抖音定位的重要性及抖音四步曲丨国仁网络资讯
  18. 《GIT教程-廖雪峰》笔记
  19. 报错 java.lang.IllegalStateException: Could not load TestContextBootstrapper [null]. Specify @Bootstra
  20. 中日企业文化不可思议的五项潜规则

热门文章

  1. 发射功率 接收灵敏度 RF射频传输 原理 介绍 三分钟看懂 详解!
  2. 谷歌地图高精度模型提取1
  3. 去除趋势杀软的退出密码
  4. Quartus 入门
  5. Spark独到见解--3控制算子
  6. 风变编程的python8.9元_如何看待风变编程的 Python 网课?
  7. android获取wifi支持的信道,Android获取当前连接wifi的信道
  8. java鼠标乱跑_光标乱跑怎么办 光标乱跑解决方法【图文】
  9. Android GPS模块总结
  10. USB对拷线Linux,绿联USB对拷线升级软件方法说明