Linux UML 内核调试方法

Linux UML 内核调试方法小结

一 UML环境的搭建

1 下载內核

从官网www.kernel.org 选择版本 linux-3.10.57.tar.xz

解压到相应路径 ????/opt/um/linux-3.10.57

?

2 基于 um的内核配置

#cd /opt/um/linux-3.10.57

#cp cd /boot/config-3.8.13.13-cdos .config

# make olddefconfig ARCH=um

?

为方便进行调试,修改配置文件

#make mrproper

#make mrproper ARCH=um

# make menufconfig ARCH=um

在选择配置时确保选中:

Kernel Hacking->

Compile the kernel with debug info(对应的DEBUG_INFO配置为yes)

和Compile the kernel with frame pointers(对应的FRAME_POINTER配置为yes)

这样生成的二进制内核linux中才有详细的调试信息。

?

同时,生成完.config文件后,编译之前,可以用编辑器打开源码根目录下的Makefile文件,把编译优化等级-O2调成-O1,这样可以在保证编译通过的前提下生成的内核文件具有较好的调试效果。

3 编译内核及模块

#make linux ARCH=um

#make modules ARCH=um

#make modules_install ARCH=um

?

生成我们需要的内核了,而且支持调试了。

?

4 制作文件系统

直接启动会有问题的,提示找不到root文件系统。这样我们用人家现成的。

http://fs.devloop.org.uk/ 下载 CentOS6.x-x86-root_fs.bz2

通过gunzip2 解压 得到 CentOS6.x-x86-root_fs

注: CentOS 经过实践可用,同样的 Ubuntu Trusty 运行时会遇到各种问题.

当下载或制作好更文件系统中后,可以将上一步生成的modules拷贝到UML根文件系统的对应目录中去。在Host Linux和UML根文件系统之间传递文件,最简单的方式就是使用挂载UML根文件系统到Host Linux中的目录,然后使用cp。拷贝Host Linux中源码根目录下mods中的文件到UML根文件系统中:

#mount -o loop CentOS6.x-x86-root_fs /mnt

#cp –R /opt/um/linux-3.10.57/mods/lib/modules/3.10.57 /mnt/lib/modules

#umount /mnt

?

5 制作文件交换系统

一般情况下不使用交换文件系统也是可以的,使用交换系统可能对系统的稳定性有些好处。

使用以下命令生成:

#dd if=/dev/zero of=swap_fs bs=1M count=512

?

#mkswap ./swap_fs

?

?

二 gdb 调试UML

经过以上步骤,调试所需要的环境已经准备好,接下来就可以开始调试工作了。

1 运行 User-Mode Linux

在 编译好的/opt/um/linux-3.10.57 根目录下,执行Linux运行

# ./vmlinux ubda=.CentOS6.x-x86-root_fs ubdb=swap_fs

或者 # ./linux ubda=.CentOS6.x-x86-root_fs ubdb=swap_fs

?

出现以下信息,说明UML运行成功,默认使用root 账户登录,无密码。

CentOS release 6.5 (Final)

Kernel 3.10.57 on an i686

?

localhost login:

?

2 gdb 调试uml

保持上一步中的UML 保持运行状态,开启另一个终端。

首先查询UML 的进程号,可以看到其中的uml根进程号为29142,但是gdb绑定的是其子进程29143。

[email protected]:/opt/um/linux-3.10.57# ps -el|grep linux

4 S 0 29413 30142 27 80 0 - 8836 hrtime pts/22 00:00:02 linux

1 S 0 29420 29413 0 80 0 - 8836 SyS_io pts/22 00:00:00 linux

1 S 0 29421 29413 0 80 0 - 8836 unix_s pts/22 00:00:00 linux

1 S 0 29422 29413 0 80 0 - 8836 poll_s pts/22 00:00:00 linux

1 t 0 29423 29413 0 80 0 - 346 ptrace pts/22 00:00:00 linux

1 t 0 29551 29413 0 80 0 - 167 ptrace pts/22 00:00:00 linux

1 t 0 29702 29413 0 80 0 - 172 ptrace pts/22 00:00:00 linux

1 t 0 30000 29413 0 80 0 - 242 ptrace pts/22 00:00:00 linux

1 t 0 30025 29413 0 80 0 - 357 ptrace pts/22 00:00:00 linux

1 t 0 30032 29413 0 80 0 - 381 ptrace pts/22 00:00:00 linux

?

启动gdb,进入gdb调试环境

#gdb linux

#attach 29143

?

3 测试gdb

在gdb 环境中设置断点在sys_clone。

#b sys_clone

#i b

?

在UML环境中执行命令ls -l,系统将会在sys_clone()函数处停下来,现在就可以在gdb中查看sys_clone()函数运行的状态。

?

至此,UML 调试环境已经搭建起来了,我们就可以对linux 内核进行基本的调试了。

?

参考文档

1 http://blog.csdn.net/ztz0223/article/details/7874759

2 http://blog.chinaunix.net/uid-21525518-id-1824661.html

3 http://blog.sina.com.cn/s/blog_70dd16910101akk2.html

?

?

?

时间: 2024-10-27 19:54:37

Linux UML 内核调试方法的相关文章

Linux内核调试方法总结之序言

本系列主要介绍Linux内核死机.异常重启类稳定性问题的调试方法. 在Linux系统中,一切皆为文件,而系统运行的载体,是一类特殊的文件,即进程.因此,我尝试从进程的角度分析Linux内核的死机.异常重启等问题.在内核空间,内核本身是一个特权级的进程,它包含一系列系统级线程,维护整个系统内核的运转.在用户空间,有很多用户进程实现不同的功能,它们有的是独立运行,有些相互之间有依赖(同步或者互斥).在32位系统中,内核进程独享3GB~4GB的高1GB内存空间,而每个用户进程则分别占据0GB~3GB的

嵌入式linux应用程序调试方法

嵌入式linux应用程序调试方法 四 内存工具 17 4.1 MEMWATCH 17 4.2 YAMD 22 4.3 Electric Fence 24 五 C/C++代码覆盖.性能profiling工具 24 5.1 用gcov来测试代码覆盖率 25 5.2 使用gprof来优化你的C/C++程序 35 四 内存工具 您肯定不想陷入类似在几千次调用之后发生分配溢出这样的情形. 许多小组花了许许多多时间来跟踪稀奇古怪的内存错误问题.应用程序在有的开发工作站上能运行,但在新的产品工作站上,这个应用

Linux内核调试方法总结之反汇编

Linux反汇编调试方法 Linux内核模块或者应用程序经常因为各种各样的原因而崩溃,一般情况下都会打印函数调用栈信息,那么,这种情况下,我们怎么去定位问题呢?本文档介绍了一种反汇编的方法辅助定位此类问题. 代码示例如下: #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <execinfo.h> #include <fcntl.h> #include <

Linux内核调试方法总结

一  调试前的准备 二  内核中的bug 三  内核调试配置选项 1  内核配置 2  调试原子操作 四  引发bug并打印信息 1  BUG()和BUG_ON() 2  dump_stack() 五  printk() 1  printk函数的健壮性 2  printk函数脆弱之处 3  LOG等级 4  记录缓冲区 5  syslogd/klogd 6  dmesg 7 注意 8 内核printk和日志系统的总体结构 9  动态调试 六  内存调试工具 1  MEMWATCH 2  YAMD

Linux内核调试方法总结之ddebug

[用途] Linux内核动态调试特性,适用于驱动和内核各子系统调试.动态调试的主要功能就是允许你动态的打开或者关闭内核代码中的各种提示信息.适用于驱动和内核线程功能调试. [使用方法] 依赖于CONFIG_DYNAMIC_DEBUG内核配置选项,一旦设置好,那么所有pr_debug()/dev_debug()之类的内核调试函数就可以动态地打印日志到终端.通过读写<debugfs>/dynamic_debug/control文件在系统启动之后打开或者关闭调试日志. [参考] http://www

Linux内核调试方法总结之调试宏

本文介绍的内核调试宏属于静态调试方法,通过调试宏主动触发oops从而打印出函数调用栈信息. 1) BUG_ON 查看bug处堆栈内容,主动制造oops Linux中BUG_ON,WARN_ON用于调试,比如 #define BUG_ON(condition) do { / if (unlikely((condition)!=0)) / BUG(); / } while(0) 如果觉得该condition下是一个BUG,可以添加此调试信息,查看对应堆栈内容 具体的BUG_ON最终调用__bug _

Linux内核调试方法总结之coredump

什么是core dump? 分析core dump是Linux应用程序调试的一种有效方式,像内核调试抓取ram dump一样,core dump主要是获取应用程序崩溃时的现场信息,如程序运行时的内存.寄存器状态.堆栈指针.内存管理信息.函数调用堆栈信息等. Core dump又称为“核心转储”,是Linux基于信号实现的.Linux中信号是一种异步事件处理机制,每种信号都对应有默认的异常处理操作,默认操作包括忽略该信号(Ignore).暂停进程(Stop).终止进程(Terminate).终止并

Linux内核调试方法总结之ptrace

ptrace [用途] 进程跟踪器,类似于gdb watch的调试方法 [原理][详细说明参考man ptrace帮助文档] ptrace系统调用主要是父进程用来观察和控制子进程的执行过程.检查并替换子进程执行序列或者寄存器值的一种手段.主要用于实现断点调试和跟踪系统调用. [接口说明] #include <sys/ptrace.h> long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data); 序

Linux内核调试方法总结之ftrace

ftrace [用途] ftrace包含一系列跟踪器,用于不同的场合,比如跟踪内核函数调用(function tracer).跟踪上下文切换(sched_switch tracer).查看中断被关闭的时长(irqsoff tracer).跟踪内核中的延迟以及性能问题等.Ftrace是内建于Linux的内核跟踪工具,依赖于内核配置宏(Kernel Hacking->Tracers)和debugfs. [原理]                         ftrace本质上是一种静态代码插装技术