前几天遇到一个棘手的问题,在OpenStack上的虚拟机中运行的应用程序陷入了一个死循环。由于该应用程序具有非常高的优先级,导致其他程序和内核线程无法获得CPU资源,包括SSH和控制台登录等关键服务也受到影响,最终系统表现为卡顿:
[程序员] rcu_sched检测到CPU或任务上的阻塞
这个问题引发了一个后续的疑问:如何定位导致此类问题的应用程序?后来,我想到一个方法,即检查内存转储文件,通过查找内存中函数的地址来追踪程序堆栈。实施这种方法之前,需要一个十六进制编辑器。在Windows环境下,虽然Notepad++可能是个选择,但对于动辄数GB大小的虚拟机内存文件,Notepad++显然力不从心。因此,我找到了一个适用于Linux环境的编辑器——bvi。
bvi可以从以下链接下载:bvi源码下载链接。手动编译时,需要先安装ncurses-devel依赖包。编译过程非常简单,只需执行以下命令即可完成安装:./configure; make; make install;
我使用的是最新版本的bvi,其字符串搜索功能与vi相同,而十六进制搜索则需使用反斜杠。值得注意的是,如果内存是以小端模式存储的,则在搜索十六进制值时应考虑其顺序。
有关bvi的详细使用说明,可以在这里查看,或者直接在Linux终端输入“man bvi”获取帮助文档。文档是英文的,这再次证明了掌握英语的重要性。


雷达卡


京公网安备 11010802022788号







