BUG: Bad page map in process XXX pte:800000036fae6227 pmd:35be8c067
首先给出内核的打印信息,串口会有一些,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相关推荐
- failed to get the task for process XXX(解决方案)
引人: iOS真机调试程序,报如下错误信息: failed to get the task for process XXX 原因: 证书问题,project和targets的证书都必须是开发证书,AD ...
- userdel: user xxx is currently used by process xxx 解决方案
当我们想删除某个用户的时候,出现 user xxx is currently used by process xxx,可能的原因是你创建用户user1之后,使用su命令切换到user1用户下,之后又想 ...
- 【疑难教程】视频上云服务平台EasyCVR使用Go语言可执行程序出现“Process XXX has exited with status XXXX”错误
GO语言在TSINGSEE青犀视频研发中起到了至关重要的作用,比如在开发 EasyCVR 的部分功能过程中,需要使用调用 C/C++ 的代码,一般采用 Cgo 的方式.当运行生成的可执行程序时,出现以 ...
- linux删除用户出现user xxx is currently used by process xxx的解决方案
linux删除用户出现user xxx is currently used by process xxx的解决方案 当我们想要删除或更改某个用户名时发现user xxx is currently us ...
- Linux中使用userdel命令删除用户时出现错误 “userdel: user XXX is currently used by process XXX”*
Linux中使用userdel命令删除用户时出现错误 "userdel: user XXX is currently used by process XXX" [root@loca ...
- 用 LSN 画个 PAGE MAP
* GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 想法从何而来 获得雨果奖的科幻小说<三体>中出现了一个流行词汇:降维打击.更高维度文明对较低维度文明的打击 ...
- Cannot set priority of nodemanager process xxx问题
Cannot set priority of nodemanager process xxx问题 一.问题描述 这个问题是我在配置hadoop集群时遇到的问题,启动resourcemanager和no ...
- Kernel Page Global Directory (PGD) of Page table of Process created in Linux Kernel
Kernel Page Global Directory (PGD) of User process created 在早期版本: 在fork一个进程的时候,必须建立进程自己的内核页目录项(内核页目录 ...
- Inferior 1 (process xxx) exited with code 0177
今天调试的时候遇到个很奇怪的问题,我的服务是多进程的,每次收到请求子进程就退出了,然后又重新被父进程拉起一个新的子进程,看了下core目录也没有生成core文件. 通过日志看到当前执行到了哪里,在后面 ...
- Android 开机Process xxx (pid xxxx) has died问题分析
系统中有一个监听BOOT_COMPLETED广播的自启应用,概率性出现启动后被kill掉的现象.Log如下: 08-12 16:48:40.453 773 908 I ActivityManager: ...
最新文章
- android ip 黑白名单,GaussDB T 单机 IP黑白名单配置
- C++ 异常机制分析
- hdu1874 畅通工程续
- 简单判断用户重复登录,记录一下
- 【转】centos安装vim7.4(转)
- fg jobs bg
- sobel算子实现边缘检测及其c++实现及与matlab效果对比
- 幻塔html5,《幻塔》捏脸系统怎么玩 捏脸系统玩法分享
- python--图像分割GraphCut
- sam音高修正_Melodyneplugin音高修正插件使用入门(精)
- 计算机出现函数不正确的是,小编教你快速修复无法访问函数不正确的方法
- 日记侠:如何提高朋友圈活跃度,给你5种实用方法
- xxl-job任务调度平台发送报警邮件
- 雷允上药业百年老店回春
- vimdiff常用命令详解
- python文本文件对比_Python-文件差异对比
- 干货来袭:抖音定位的重要性及抖音四步曲丨国仁网络资讯
- 《GIT教程-廖雪峰》笔记
- 报错 java.lang.IllegalStateException: Could not load TestContextBootstrapper [null]. Specify @Bootstra
- 中日企业文化不可思议的五项潜规则