当gdb不支持OS时,使用gdb的Python来回溯不同的操作系统线程

问题描述:

我仍然在学习如何在gdb(arm-none-eabi-gdb,在我的情况下)中使用Python进行调试。我正尝试使用此工具来获取在ARM Cortex-M上运行的实时操作系统的线程信息。读取一些OS结构后,我可以访问操作系统的线程控制块。我知道每个线程的PC和SP。我如何使用gdb的Python来转储线程的回溯。给定PC和SP时是否有通用API可以遍历堆栈?当gdb不支持OS时,使用gdb的Python来回溯不同的操作系统线程

我看过https://sourceware.org/gdb/current/onlinedocs/gdb/Unwinding-Frames-in-Python.html#Unwinding-Frames-in-Python,我觉得可能有办法做到这一点,但我需要一些帮助。

此外,如果可能,我可以让gdb知道操作系统的不同线程吗?此链接: https://sourceware.org/gdb/current/onlinedocs/gdb/Threads-In-Python.html#Threads-In-Python触及线程,但依赖于操作系统信息。可以通过我所了解的有关各自控制块的不同操作系统线程来超载吗?

谢谢!

经过多次阅读并尝试利用我多年来积累的旧调试器知识后,我设法实现了这一目标。它缺乏优化,但现在,我很高兴。这可以被认为是穷人的调试器,它利用GDB的Python支持来跟踪系统中的活动线程。我认为这是通用的,但是实现的目标是RTX(Keil的操作系统)。它在Cortex-M0上工作。它可能需要调整以适应其他操作系统或不同的内核。

的主要思路:

  1. 使用OS结构,以确定线程控制块驻留在哪里。
  2. 从线程控制块识别不同的线程堆栈在哪里。
  3. 从堆栈中读取所有重要的寄存器; SP,LR和PC
  4. 保存当前正在运行的线程的相同寄存器。
  5. 在不同线程上循环,将重要寄存器更改为与线程匹配的寄存器,然后打印回溯。
  6. 享受一个穷人的操作系统感知调试器。

该脚本可以在这里找到:

https://gitlab.com/hesham/gdb-rtx-thread-backtrce/blob/master/rtx-threads-bt.py

这是一个很好的锻炼,探索GDB的Python扩展的力量!