gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:37:34 25 4
gpt4 key购买 nike

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

我已阅读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涉及线程但依赖于操作系统信息。这些是否会因我对各自控制 block 中不同操作系统线程的了解而过载?

谢谢!

最佳答案

经过更多阅读并尝试利用我多年来积累的旧调试器知识,我成功地使其工作起来。它缺乏优化,但就目前而言,我非常满意。这可以被认为是一个穷人的调试器,利用 GDB 的 Python 支持来跟踪系统中的事件线程。我认为它是通用的,但实现是针对 RTX(Keil 的操作系统)的。它适用于 Cortex-M0。它可能需要一些调整以适应其他操作系统或不同的内核。

主要思想:

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

该脚本可以在这里找到:

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

这是探索 GDB Python 扩展的强大功能的一个非常好的练习!

关于c - 当 gdb 不支持操作系统时,使用 gdb 的 Python 回溯不同的操作系统线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39598893/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com