打印

使用KGDB在QEMU上调试内核

[复制链接]
234|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
3月的尾巴|  楼主 | 2018-8-22 11:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Linux是一个非常棒的操作系统, 很多Linux的爱好者, 都想深入的学习它, 市面上的工具也很多, 今天给大家介绍一下怎么用KGDB来调试kernel的方法.




1. 下载最新Linux内核




首先去Linux 官方网站 www.kernel.org 下载最新的内核源码, 现在最新的版本是4.0. 我们以4.2.8为例.




假设缺省工作目录为/home/linux/workspace




$ cd workspace




$ wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.2.8.tar.xz




$ tar -xvf linux-4.2.8.tar.xz




$ mv linux-4.2.8 linux




2. 配置内核选择




如果要使能kgdb调试进行调试, 需要使用KGDB over the serial console 作为与gdb通信模块。




$ cd linux




$ make defconfig




$ make menuconfig




选中 KGDB: use kgdb over the serial console 选项




General setup —>




Prompt for development and/or incomplete code/driversKernel hacking —>




Compile the kernel with debug info




Compile the kernel with frame pointers




KGDB: kernel debugger —>




<*> KGDB: use kgdb over the serial console




3. 编译kernel




我们可以使用 -j选项, 根据CPU数来进行并行编译,从而加快编译速度,如果机器CPU是双核4线程, -j后面跟上4.




如:




$ make -j4




如果想要保持linux目录的clear,将编译产生的二进制文件放到另一个目录下,请参考使用下面的命令:




$ mkdir obj




$ cd linux




$ make O=../obj defconfig




$ make O=../obj -j4




编译完成后,复制bzImage和vmlinux到工作目录下备用




$ cp arch/x86/boot/bzImage ~/workspace




$ cp vmlinux ~/workspace




4. 安装qemu




我们用的系统为ubuntu15.04. 也可以直接下载源码进行编译安装.




$ sudo apt-get install qemu




5. 用qemu启动Linux




用qemu启动我们刚刚编译的好的内核文件. 需要使用到根文件系统, 可以下载别人做好的, 也可以根据网上教程自己制作一个根文件系统.




$ qemu -kernel ~/workspace/bzImage -append "root=/dev/sda" -boot c -sda ~/workspace/busybox.img -k en-us




6. 启用KGDB




我们已经使用qume启动Linux系统了, 如果要使用kgdb需要在内核启动时增加参数. 当然也可以在内核启动后echo kgdboc模块的参数来重新设置参数. 这两种方式都可以, 在这里我们采用在内核启动时增加启动参数的方式:(kgdboc=ttyS0,115200 kgdbwait)




$ qemu -kernel ~/workspace/bzImage -append "root=/dev/hda kgdboc=ttyS0,115200kgdbwait" -boot c -sda ~/workspace/busybox.img -k en-us -serial tcp::5566,server




这时,运行qemu的终端将提示等待远程连接到本地端口4321:




QEMU waiting for connection on: tcp:0.0.0.0:4321,server




这时使用另外一个控制台执行:




$ gdb /usr/src/work/vmlinux(gdb) target remote localhost:4321




然后qemu就可以继续正常运行下去,最后停止内核,并显示如下信息:




kgdb: Waiting for connection from remote gdb…




这时gdb这边就可以看到如下的提示:




(gdb) target remote localhost:4321Remote debugging using localhost:4321kgdb_breakpoint () at kernel/debug/debug_core.c:983983 wmb(); /* Sync point after breakpoint */(gdb)




开始kernel的旅行吧!!!




注:和上面的**不同的是,它将qemu的虚拟串口导向到本地的一个”pty”设备上,而前面我们是导向到一个socket端口上.




qemu -serial参数介绍如下:




-serial devRedirect the virtual serial port to host character device dev. The default devices "vc" in graphical mode and "stdio" in non graphical mode. This option can based several times to simulate up to 4 serials ports.




如果gdb提示如下信息:




warning: Invalid remote reply:




可以使用Ctrl+C来终止当前gdb的操作,再次使用下面命令重新连接一次kgdb即可:




(gdb) target remote localhost:4321




参考:




http://kernel.org/pub/linux/kernel/people/jwessel/kgdb/




setting up kgdb using kvmqemu

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

433

主题

433

帖子

0

粉丝