form:https://blog.csdn.net/lwyeluo/article/details/63262489下载并编译内核制作busybox所需要的rootfs安装qemu安装busybox启动qemu进行调试调试示例下载并编译内核内核源码可以在 https://www.kernel.org/pub/linux/kernel/ 下载,本文使用的内核为3.13。首先进行内核编译,在内核源码路径下执行:sudo apt-get install m4 libncurses5-dev -y make menuconfig(选中         kernel hacking –> Kernel debugging         kernel hacking –> Compile-time checks and compiler options  –> compile the kernel with debug info         kernel hacking –> Compile-time checks and compiler options  -> compile the kernel with frame pointersmake拷贝bzImage到我们用来调试的目录,如/opt/kernel-debugmkdir -p /opt/kernel-debugcp arch/x86/boot/bzImage /opt/kernel-debug制作busybox所需要的rootfs执行以下命令在/opt/kernel-debug下创建rootfscd /opt/kernel-debugdd if=/dev/zero of=rootfs.img bs=1M count=10mkfs.ext3 rootfs.imgmkdir rootfs# 将其mount 到新创建到目录上mount -t ext3 -o loop rootfs.img rootfscd rootfsmkdir dev proc sys安装qemu(使用apt install下载,无法终端)下载qemu-1.3.0.tar.bz2到指定目录安装依赖包apt-get install build-essential libtool automake \libgmp-dev libnspr4-dev libnss3-dev openssl \libssl-dev git iasl glib-2.0 libglib2.0-0 \libglib2.0-dev libtasn1-6-dev tpm-tools \libfuse-dev libgnutls-dev libsdl1.2-dev \expect gawk socat libfdt-dev编译qemutar -xjvf qemu-1.3.0.tar.bz2cd qemu-1.3.0./configure --enable-kvm --enable-sdl --target-list=x86_64-softmmumakemake install安装busyboxwget https://busybox.net/downloads/busybox-1.26.1.tar.bz2tar -xjvf busybox-1.26.1.tar.bz2cd busybox-1.26.1make menuconfig   - 选择静态编译:Busybox Settings->Build Busybox as a static binary   - 取消选择Networking utilities->iptunnel (NEW)   - 取消选择Networking utilities->inetdmake安装到bzImage下的rootfs下make install CONFIG_PREFIX=/opt/kernel-debug/rootfsunmount rootfscd /opt/kernel-debugsudo umount rootfs启动qemu进行调试启动qemucd /opt/kernel-debug1.使用busybox中的ash.c作为启动入口qemu-system-x86_64  -S -kernel bzImage -hda rootfs.img -append "root=/dev/sda init=/bin/ash"2.使用busybox中的init.c作为启动入口qemu-system-x86_64  -S -kernel bzImage -hda rootfs.img -append "root=/dev/sda init=/sbin/init"用鼠标点击qemu窗口,然后ctrl+alt+2切换到控制台,输入gdbserver tcp::1234打开另外一个终端,安装ddd,并运行ddd vmlinuxapt-get install ddd# 进入linux源码路径,本文路径为/usr/src/linux-3.13-objcd /usr/src/linux-3.13-objddd vmlinux界面为:在gdb的命令行中输入命令target remote localhost:1234将qemu虚拟机连接到ddd的控制台自此就可以通过ddd的控制台用gdb的命令来查看源码的运行信息了在gdb命令中输入continue,出现错误:(gdb) continueContinuing.Continuing.Remote 'g' packet reply is too long: edffffff00000000ffffffffffffffff0000000000000001000000000000000000000000000000004600000000000000b81ec081ffffffffb81ec081ffffffff000000000000000000000000000000002900000000000000689eea81ffffffff0000000000000000d81fc081ffffffffc022dd81ffffffffd81fc081ffffffff86050581ffffffff8602000010000000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f030000000000000000000000000000000000000000000000000000000000000000ff0000000000000000000000000020202020202020202020202020202020000000ff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff00000000000000000000ff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff00000000000000ff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000801f0000(gdb) Quit解决方案:下载更高版本的gdb:wget http://ftp.gnu.org/gnu/gdb/gdb-7.11.tar.gztar xzvf gdb-7.11.tar.gzcd gdb-7.11vim gdb/remote.c注释掉if (buf_len > 2 * rsa->sizeof_g_packet)    error (_(“Remote ‘g’ packet reply is too long: %s”), rs->buf);在其后加上if (buf_len > 2 * rsa->sizeof_g_packet) {      rsa->sizeof_g_packet = buf_len;      for (i = 0; i          if (rsa->regs[i].pnum == -1)              continue;          if (rsa->regs[i].offset >= rsa->sizeof_g_packet)              rsa->regs[i].in_g_packet = 0;          else             rsa->regs[i].in_g_packet = 1;    }}安装gdbapt-get install texinfo./configuremakemake installmv /usr/bin/gdb /usr/bin/gdb.bakln -s /usr/local/bin/gdb /usr/bin/gdb再重新 ddd vmlinux后,gdb界面里显示:(gdb) target remote localhost:1234Remote debugging using localhost:1234native_safe_halt () at /usr/src/octa-blockIMA/octa-blockIMA/arch/x86/include/asm/irqflags.h:50(gdb)关于ddd的介绍见 http://blog.csdn.net/mirage1993/article/details/50883824调试示例在本机上写一段程序:root@BlockIMATest:~# cat fork.c#include int main() {   int fd;    fd = fork();     if(fd == 0) {       printf("I am child\n");   } else if(fd > 0) {       printf("I am parenet\n");   }   return 0;}root@BlockIMATest:~#编译成静态的二进制程序gcc -c -g -static fork.cgcc -o test_fork -static fork.o将该二进制拷贝到/opt/kernel-debug/rootfs/bin下cd /opt/kernel-debug# 将其mount 到rootfs上mount -t ext3 -o loop rootfs.img rootfscd rootfscp ~/test_fork /opt/kernel-debug/rootfs/bin/cd ../sudo umount rootfs启动qemucd /opt/kernel-debugqemu-system-x86_64  -S -kernel bzImage -hda rootfs.img -append "root=/dev/sda init=/bin/ash"用鼠标点击qemu窗口,然后ctrl+alt+2切换到控制台,输入gdbserver tcp::1234另开一个终端,在内核目录下启动ddd vmlinux在gdb里连接到qemu,让其运行GNU DDD 3.3.12 (x86_64-pc-linux-gnu), by Dorothea LReading symbols from vmlinux...done.(gdb) target remote localhost:1234Remote debugging using localhost:12340x0000000000000000 in irq_stack_union ()(gdb) continueContinuing.在qemu窗口,使用ctrl+alt+1切换到虚拟机界面,等待虚拟机启动。虚拟机启动成功后,在ddd界面里source->Breakpoints里添加一个断点,在弹出的Set point at文本框中输入do_fork回到qemu窗口,执行test_fork,可以看到进入断点了~
11-06 07:23
查看更多