1

我试图让内核调试在引导期间工作。我已经按照所有步骤安装它(如何在以太网上使用 kgdb(kgdboe)?)并且在加载后我 insmod 时可以正常连接,但是如果我添加这个

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 地址,即使尝试在启动时加载它?

谢谢

4

1 回答 1

2

是的,对于早期的内核调试,kgdboe 并没有真正起作用。有几个问题,有些容易解决,有些无法解决。您可以硬链接所需的模块,而不是按需加载它们来解决简单的问题。但核心问题是kgdb提前等待会暂停所有工作线程,而且几乎所有的以太网PCIe卡驱动都需要工作线程,否则需要IRQ。即使在轮询以太网驱动程序支持(非常有限)上,IRQ 也可以被抢占(或非法持有锁),并阻止轮询以太网驱动程序运行。因此,早期内核调试无法可靠地使用 kgdboe,并且根本无法使用某些以太网驱动程序。(例如 GRUB2 引导行上的 kgdbwait。) 偶尔有人谈论破解各种以太网驱动程序源以尝试通过专用以太网驱动程序提供 kgdboe 支持,但据我所知,没有一个是分发的。您仍然最好使用串行端口,如果需要使用 kgdboc(代理代理),则可以使用串行控制台将其多路复用到单个串行端口上,以获得完整的功能。如果需要真正的远程访问,则远程进入启动串行连接的调试系统。

您也可以使用 USB 端口,但需要一个不再出售的特定 USB<->串行 USB 加密狗。(Ajays 蓝色加密狗)。这些产品大约在 6 个月前停产,目前还没有替代品。(它是一款适用于 Linux 的 Windows 调试设备,Windows 已经转向原生 USB3.0 调试功能,而 Linux 尚未赶上。)所以,除非你有所需的 USB 转换器,或者有其他来源,或者有一个替代适配器,你在 USB2.0 上运气不好。

遗憾的是,即使在 2016 年,串行仍然是您的最佳选择。请参阅:http: //kdbg.wiki.kernel.org

于 2016-03-04T18:15:51.060 回答