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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值