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

gdb qemu调试linux kernel并修改远程连接的bug

2015-10-27 12:28 423 查看

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: