【问题标题】:debugging Device driver using GDB使用 GDB 调试设备驱动程序
【发布时间】:2018-05-28 09:03:43
【问题描述】:

我是 Linux 设备驱动程序的新手。我的第一天任务是在 Linux 中使用 GDB 调试驱动程序。

  • 我需要调试一些 XYZ(PCIe 设备驱动程序支持以太网)设备驱动程序以了解流程以及设备寄存器上发生的情况等。

我已经安装了带有补丁文件和insmod命令的驱动程序。

设备工作正常。但是没有得到任何解决方案来调试设备驱动程序

我只知道如何在 Linux(fedora20) 中使用 GDB 调试 C 程序。我得到了一个与我的问题类似的link,但从中我也没有任何知识。

任何人都可以分享您的想法,我该如何从头开始。 我非常具体地了解在 Linux 中调试设备驱动程序。尤其是我的驱动程序中的 initprobe 函数,我需要知道流程。

【问题讨论】:

  • 您为哪种设备编写 Linux 驱动程序?请编辑您的问题以改进它,如果可能的话显示一些minimal reproducible example(或至少提供一个指向您的代码的链接)。

标签: linux debugging gdb linux-device-driver device-driver


【解决方案1】:

gdb debugger is useful 用于调试user-space 应用程序级程序(因为它使用ptrace(2))。

对于内核代码,情况有所不同。考虑using kgdb(我不知道细节)。您也可以添加debug prints ....

我建议至少阅读有关操作系统的更多信息,例如Operating Systems: Three Easy Pieces(可免费下载),并阅读一些关于 Linux 编程的内容(也许是旧的 ALP,还有 intro(2)syscalls(2) 和相关的东西)。在不熟悉 Linux 编程(在用户领域)的情况下,不敢编写 Linux loadable kernel modules。另见kernelnewbies

顺便说一句,您应该更喜欢编写用户级代码而不是内核模块。一个非常简单的经验法则是尽可能避免编写内核代码。

【讨论】:

  • 内核模块被插入内核,内核代码也是如此。
  • 你的意思是我的设备驱动程序有一些内核模块,所以它已经被插入到内核中.. 使用 KGDB 我需要尝试调试我的设备驱动程序对吗?我不了解设备驱动程序,所以问这种问题需要很多帮助
  • 在输入一行内核代码之前,您需要花费数周的时间阅读更多内容。
  • 3 天根本不够。您可能需要至少 3 周,甚至可能需要 3 个月。您可以在该模块中添加各种打印语句。您可能找不到任何分步程序。如果您在 3 天内调试该内核模块失败会怎样?
【解决方案2】:

首先,您可能需要了解 linux 中设备驱动程序和内核的基础知识。随后根据手中的驱动程序类型进行关注。您还需要了解您正在使用的设备的功能(规格/手册/数据表)。

调试的最基本方法是使用 printk。通常会有可以通过编译标志启用的调试日志。如果存在,请启用它,以便它可以提供重要的指示,否则您可能需要自己添加它。

首先验证驱动程序注册和驱动程序加载验证(根据您的要求静态或可加载模块)。检查它是否被列为 sysfs 或 proc 的一部分(如果适用)。检查探测是否成功,随后根据您的驱动程序/设备功能进行适当的读/写/打开/关闭/其他调用。

dmesg 对查看内核消息非常有帮助。还有一些工具,如 kdb、LTT、strace,可以根据场景使用。

【讨论】:

    猜你喜欢
    • 2012-06-22
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 2017-07-29
    • 2010-12-29
    • 1970-01-01
    相关资源
    最近更新 更多