调试嵌入式软件(核心转储)

3
我目前正在处理一个嵌入式CPU(ARM cortex-M0)的板子。我遇到了崩溃(HardFault),因此我试图对其进行调试。
目前,我可以获取内存的转储(我将所有内容以十六进制发送到printf控制台,这是我唯一能够访问内存的方式)。
我的想法是将该转储加载为coredump到gdb中,从而能够调试程序。如何从原始内存转储中创建与gdb兼容的“真实”coredump文件,以便我可以直接提供给gdb?
我还尝试在gdb模拟器中运行我的程序,使用我的原始内存和“restore”命令,但我不知道如何运行它。你有什么想法吗?
主要问题在于:如何基于程序elf和原始内存内容创建与gdb兼容的coredump文件?

你为什么不能使用芯片内置调试器? - Lundin
2
我怀疑仅仅进行内存转储是不够的;寄存器状态也是必要的。在https://www.sourceware.org/ml/gdb/1999-q2/msg00065.html 上有一个关于这个主题的讨论线程。当你遇到硬件故障时,在许多情况下,printf 仍能工作很难 - 特别是如果它是带缓冲区且中断驱动的。在这种情况下,硬件调试器将更加有效。 - Clifford
1
这类项目的自定义实践是拥有硬件的调试版本。或者至少在我处理涉及反向工程安全锁的项目时,我所做的就是这样。即使只是一个评估板+ICD+杂项手动焊接的垃圾,也比通过printf进行调试要好得多。特别是因为stdio.h在生产代码中不被使用。 - Lundin
1
在硬错误处理程序中使用您的十六进制打印函数(反正您已经挂了,不用担心处理程序中可以或不可以做什么)来转储堆栈并找出导致故障的指令(地址),使用程序的反汇编从该指令向后工作,使用该代码空间中的十六进制printf打印数据/地址值以确认它们是导致问题指令的正确值。 - old_timer
你感到困惑了吗?你正在运行 RTL 吗?那么只需在仿真中运行它并查看波形即可。 - old_timer
显示剩余11条评论
1个回答

1
有一对库可以做到这一点:CrashCatcherCrashDebug。前者打印一个转储(您已经在做了,但这个以特定格式打印),而后者则与gdb接口,允许加载该转储。由于某种原因,CrashDebug不会创建核心文件,而是使用gdb的target remote命令与gdb接口。虽然如此,但效果相同。它支持Cortex-M0、M3和M4。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接