在没有 GDB 的板上调试 Linux 内核
Debug Linux kernel in a board without GDB
我完全不熟悉在板上开发驱动程序的任务,它使用 "small" Linux。每次我制作所有东西并在 PC 上得到一个“.bin”文件,然后 ftp“.bin”到开发板,系统就会正常工作。
现在问题来了。我检查了系统,它不能使用gdb。所以当系统崩溃时,它只会提供一个核心转储文件,它给出了乱七八糟的地址信息(似乎没有帮助或者至少我不知道如何使用它)。
哪位有经验的嵌入式开发者可以给点建议?你在工作中是如何调试的?
顺便说一下,如果控制台打印崩溃信息包括堆栈信息和调用跟踪,则没有 epc 和 ra(我刚刚了解到)。 epc(崩溃地址)还能找到吗?
许多内核开发人员,包括我自己,在开发设备驱动程序时不使用调试器。多年来,Linux 不支持内核调试。即使是现在,也并非所有 CPU 架构都支持内核调试。
您可以做的最简单的事情之一是使用 printk 将事件记录到控制台。此外,提高控制台 UART 速度。我经常用115200波特。
对于某些 CPU 架构,Linux 内核现在支持 kgdb。
我也强烈推荐Linux内核开发者阅读这两本书:
- Linux Device Drivers,作者:乔纳森·科贝特、亚历山德罗·鲁比尼、格雷格·克罗-哈特曼
- Understanding the Linux Kernel,作者:Daniel P. Bovet,Marco Cesati
我完全不熟悉在板上开发驱动程序的任务,它使用 "small" Linux。每次我制作所有东西并在 PC 上得到一个“.bin”文件,然后 ftp“.bin”到开发板,系统就会正常工作。
现在问题来了。我检查了系统,它不能使用gdb。所以当系统崩溃时,它只会提供一个核心转储文件,它给出了乱七八糟的地址信息(似乎没有帮助或者至少我不知道如何使用它)。
哪位有经验的嵌入式开发者可以给点建议?你在工作中是如何调试的?
顺便说一下,如果控制台打印崩溃信息包括堆栈信息和调用跟踪,则没有 epc 和 ra(我刚刚了解到)。 epc(崩溃地址)还能找到吗?
许多内核开发人员,包括我自己,在开发设备驱动程序时不使用调试器。多年来,Linux 不支持内核调试。即使是现在,也并非所有 CPU 架构都支持内核调试。
您可以做的最简单的事情之一是使用 printk 将事件记录到控制台。此外,提高控制台 UART 速度。我经常用115200波特。
对于某些 CPU 架构,Linux 内核现在支持 kgdb。
我也强烈推荐Linux内核开发者阅读这两本书:
- Linux Device Drivers,作者:乔纳森·科贝特、亚历山德罗·鲁比尼、格雷格·克罗-哈特曼
- Understanding the Linux Kernel,作者:Daniel P. Bovet,Marco Cesati