0.prepare
make defconfig
make menuconfig
make
1.qemu
qemu-i386* -kernel arch/x86/boot/bzImage -initrd /boot/initrd.img-2.6.31-22-generic -gdb tcp::1234 -S
2.gdb
file vmlinux
target remote:1234
b func
c
b|set breakpoint
c|continue
s| one lien src,into the func
n|next over the func
si|stepi,one instrument ,into func
ni|nexti,one instrument ,over the func
finish|dbg to return
p|print
display|display
4.fix bug
~~~~
ubuntu12.04的是7.4的gdb,里边在和qemu远程链接的时候会有问题。需要重新编译修改gdb源码。
由于7.4是没有源码的,所以自己搞一个7.6的gdb,来重新配置和编译。
参考网上的方法:
GDB远程调试错误解决
使用GDB 7.2版本进行远程调试时出现:Remote ‘g’ packet reply is too long错误,需要修改gdb代码解决,办法是:修改gdb/remote.c文件,屏蔽process_g_packet函数中的下列两行:
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 < gdbarch_num_regs (gdbarch); i++) {
if (rsa->regs.pnum == -1)
continue;
if (rsa->regs.offset >= rsa->sizeof_g_packet)
rsa->regs.in_g_packet = 0;
else
rsa->regs.in_g_packet = 1;
}
}
修改后,会提示regs是个指针了,就把所有涉及到的成员用->代替.
编译&安装
~~~~
./configure –prefix=$(pwd)/tmp
sudo chmod 777 tmp/
cp
~~~
因为PATH路径下已经有了gdb了,该一个名字到环境变量下:
sudo cp /tmp/bin/gdb /bin/gdb-7.6
sudo cp /tmp/bin/gdbserver /bin/gdbserver-7.6
和qemu链接
~~~~~~
在vmlinux路径下(一般是在kernel编译出到源码根目录下)
(前提先打开qmeu)
gdb-7.6
file vmlinux
target remote:1234
make && make install