我正在尝试让内核调试在引导期间工作。我已经遵循了安装它的所有步骤(how to use kgdb over ethernet(kgdboe)?),并且在加载后可以很好地连接,但是如果我添加以下内容
BOOT_IMAGE=/vmlinuz-4.0.0-rc7+ root=UUID=<my_root> ro drm.debug=0x04 kgdbwait kgdboe=@<src_ip>/eth1,@<target_ip>/ vt.handoff=7在内核引导行中,我看不到模块已加载,也没有kgdbwait。
当我查看我的kern.log时,我看到了以下内容:
kgdboe: eth0 does not have a in_ifaddr struct associated. Cannot get default IP address.顺便说一下,我有eth0和eth1,但只有eth1是连接的。
有什么建议吗?只是pcie网卡在引导后才加载,这会导致我的问题吗?
另外,为什么我需要指定源或目标ip地址?有没有办法让kgdboe接受所有的ip地址,即使在引导时试图加载它?
谢谢
发布于 2016-03-05 02:15:51
是的,对于早期的内核调试,kgdboe并不能真正工作。有几个问题,有些容易解决,有些不能解决。您可以硬链接所需的模块,而不是按需加载它们来解决这个简单的问题。但是核心问题是kgdb的早期等待将暂停所有的工作线程,并且几乎所有的以太网PCIe卡驱动程序都需要工作线程,或者需要IRQ。即使在轮询以太网驱动程序支持上(非常有限),IRQ也可以被抢占(或非法持有锁),并阻止轮询以太网驱动程序工作。因此,早期内核调试在使用kgdboe和一些以太网驱动程序时根本不能可靠地工作。(例如,GRUB2引导行上的kgdbwait。)偶尔会有关于修改各种以太网驱动程序源代码以尝试通过特殊用途的以太网驱动程序提供kgdboe支持的讨论,但据我所知还没有发布。您最好还是使用串行端口,并使用串行控制台,如果需要使用kgdboc (代理-代理),可以将其多路复用到单个串行端口。如果需要真正的远程访问,则远程进入启动串行连接的调试系统。
您也可以使用USB端口,但需要不再销售的特定USB <->串行USB加密狗。(Ajays Blue加密狗)。这些产品在大约6个月前就停产了,目前还没有替代产品。(它是一个适用于Linux的Windows调试设备,Windows已经转移到本机USB3.0调试功能,而Linux还没有赶上。)因此,除非您有所需的USB转换器,或者有其他来源,或者有替代适配器,否则您在USB2.0上就不走运了。
遗憾的是,即使在2016年,Serial仍然是你最好的选择。请参阅:http://kdbg.wiki.kernel.org
https://stackoverflow.com/questions/30584327
复制相似问题