您的位置:首页 > 运维架构 > Linux

QEMU+GDB 安装编译调试linux内核

2017-12-25 00:56 471 查看
1.首先在QEMU官网下载QEMU最新版的源代码,最好别用apt get install qemu 来安装,这个安装会出现某些问题,GDB远程调试的时候会导致packet过长无法调试。

2.安装一些有用的包。

sudo apt-get install git libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev

sudo apt-get install git-email

sudo apt-get install libaio-dev libbluetooth-dev libbrlapi-dev libbz2-dev

sudo apt-get install libcap-dev libcap-ng-dev libcurl4-gnutls-dev libgtk-3-dev

sudo apt-get install libibverbs-dev libjpeg8-dev libncurses5-dev libnuma-dev

sudo apt-get install librbd-dev librdmacm-de

sudo apt-get install libsasl2-dev libsdl1.2-dev libseccomp-dev libsnappy-dev libssh2-1-dev

sudo apt-get install libvde-dev libvdeplug-dev libvte-2.90-dev libxen-dev liblzo2-dev

sudo apt-get install valgrind xfslibs-dev

sudo apt-get install libnfs-dev libiscsi-dev

3.编译QEMU

# Switch to the QEMU root directory.

cd qemu

# Prepare a native debug build.

mkdir -p bin/debug/native

cd bin/debug/native

# Configure QEMU and start the build.

../../../configure --enable-debug

make

# Return to the QEMU root directory.

cd ../../..

4.编译内核

sudo apt get install libcurses5-dev

从www.kernel.org下载内核

cd 到内核文件夹

make menuconfig 把kernel hacking里面的compile with debugging info勾上 save 然后退出。

make

这一步时间比较长,完成之后会在/arch/x86/boot/里面生成bzimage文件。

5.GDB调试

然后跑qemu-system-x86_64(这个QEMU不能是apt-get安装的qemu否则会报TCP REMOTE错这个错误非常蛋疼)用-kernel 参数挂载这个bzimage文件 并且-s -S

另外开一个terminal,cd 到linux 主目录下  gdb vmlinux

然后监听1234端口 target remote:1234

然后设置断点 b start_kernel 然后c 就断下来了。

至此QEMU 调试LINUX 内核的基本环境就搭建好了。

接下来要研究的问题就是如何调试呢?比如我在应用层有一个程序 这个程序会有系统调用。那么假如我现在想调试这个程序,并且观测它系统调用进入内核之后的状态,该怎么做呢?直接只用上面提到的那个kernel是做不到的。

由于我现在对LINUX内核理解还不深入。我暂时主要有这么几个想法。

1.LINUX是否可以更换内核。比如我在自己的linux新编译了一个内核,那么是否我可以把老的内核替换掉。也就是说用新的内核依然进入到我的现在的操作系统,这样我就可以直接对这个操作系统进行调试。(目前查阅了一些资料,感觉上是可行的,需要进一步学习linux boot加载的机制,有点类似于嵌入式系统)

2.把应用层的代码弄成机器码或者编译成内核模块的形式 想办法植入到内核里面,然后启动内核直接调。这个方法不需要对操作系统对什么额外的工作。

目前我还不知道这两个方法的可行性,接下来继续做实验。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  qemu gdb 调试 kernel