我是Linux中设备驱动程序的新手。我的第一天任务是在Linux中使用GDB调试驱动程序。
- 我需要调试一些XYZ(PCIE设备驱动程序支持以太网)设备驱动程序,以了解该流程以及设备寄存器的情况以及所有内容。
我已经使用补丁文件安装了驱动程序, insmod 命令。
该设备正常工作。但是没有任何解决方案来调试设备驱动程序。
我所知道的是,如何使用Linux中的GDB调试C程序(Fedora20)。我得到了一个与我的问题相似的链接,但也没有任何知识。
任何人都可以分享您的想法,即如何从头开始。我非常具体地了解Linux中的调试设备驱动程序。尤其是 INIT 或 probe 在驱动程序中我需要知道流程。
gdb
调试器对于调试用户空间应用程序级别程序很有用(因为它使用ptrace(2))。
对于内核代码,情况有所不同。考虑使用kgdb
(我不知道详细信息)。您还可以添加调试打印。
我建议至少阅读有关操作系统的更多信息,例如操作系统:三个简单的作品(可自由下载),并阅读有关Linux编程的内容(也许是旧的ALP,以及Intro(2),Syscalls(2)(2)和相关内容)。在不熟悉Linux编程的情况下(在用户领域),不要敢编码Linux可加载的内核模块。另请参见kernelnewbies。
顺便说一句,您应该比内核模块更喜欢编写用户地代码。一个非常简单的经验法则是避免在可能的情况下编写内核代码。
首先,您可能需要了解Linux中设备驱动程序和内核的基础知识。随后根据手中的驾驶员类型聚焦。您还需要了解您正在使用的设备的功能(规范/手册/数据表)。
调试的非常基本的方法可以使用printk。通常,可以通过编译标志启用调试日志。如果存在,请启用它,以便它可以给出重要的指示,您可能需要自己添加它。
从验证驱动程序注册和驾驶员加载验证(根据您的要求静态或可加载模块)开始。检查它是被列为SYSFS的一部分还是PROC的适用。检查探针是否成功,随后根据您的驱动程序/设备功能进行适当的读/写/打开/关闭/其他呼叫。
DMESG对于查看内核消息非常有帮助。还有一些工具,例如KDB,LTT,Strace,可以根据情况有用。