2012-12-06 55 views
1

我正在尝试使用kgdb调试Linux内核。我使用qemu作为目标机器。 Ubuntu 12.04是我的主机操作系统。我试过这个命令KGDB远程调试错误

[email protected]:~$ qemu-system-arm -M versatilepb -m 128M -kernel zImage -initrd rootfs.img.gz -append "root=/dev/ram rdinit=/bin/sh kgdboc=ttyAMA0,115200 kgdbwait" 

这将引导并等待显示

的kgdb:等待来自远程GDB

和连接,当我尝试使用Linux主机上的gdb调试使用命令

[email protected]: arm-none-linux-gnueabi-gdb vmlinux 

(GDB):设置remotebaud 115200

(GDB)使用的/ dev/ttyS0来 忽略数据包错误,继续针对远程的/ dev/ttyS0来 远程调试......

警告:无法识别的项目 “超时” 的“qSupported” 响应

忽略数据包错误,继续......

忽略数据包错误,继续......

忽略数据包错误,继续...

忽略数据包错误,继续......

格式错误的响应,以抵消查询,超时

我没有真正得到我错过了什么!

P.S.我编译了启用KGDB选项的Linux内核2.6.39.4。我遵循​​指令在qemu上运行内核。

回答

3

如果您在主机gdb上参考/dev/ttyS0将尝试使用存在的物理串行端口。您必须将qemu的仿真串行端口连接到gdb。 阅读qemu手册,显然你可以将模拟端口重定向到tcp网络,在qemu命令行中添加如下内容:-serial tcp::1234,server。在gdb中,您可以使用target remote :1234进行连接。

+0

好的,谢谢。但是不能将我的qemu串口重定向到我的主机的ttyS0,以便我可以使用我的gdb中的/ dev/ttyS0。 – GeekFactory

+0

我不明白:使用'/ dev/ttyS0'会增加什么值? – Balau

+0

如果您想使用实际电缆连接到运行调试器的其他物理机,则只需将QEMU重定向到主机的/ dev/ttyS0。如果您只想从同一台机器进行调试,则可以在回送接口或unix域套接字上使用本地虚拟方法,如TCP。 –

1

在Qemu中运行时没有真正的理由使用kgdb。你可以简单地在Qemu命令行上指定类似“-gdb tcp :: 8888”的东西,并激活GDB存根。然后,您可以使用支持ARM的GDB连接到存根:

target remote:8888 

并调试离开。您可能会发现以下gdb helper scripts useful

+0

是的,我知道!但是我想模仿它作为一个远程机器,这样我才能在实际的目标机器上尝试之前得到一些手。是否有可能将我的模拟串行端口'/ dev/ttyAMA0'重定向到主机的串行端口'/ dev/ttyS0'? – GeekFactory

+1

@GeekFactory:当然,你可以重定向串口。例如“-serial telnet:127.0.0.1:4444”将重定向到一个tcp套接字。 – stsquad