2016-09-20 72 views
0

我仍然在學習如何在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觸及線程,但依賴於操作系統信息。可以通過我所瞭解的有關各自控制塊的不同操作系統線程來超載嗎?

謝謝!

回答

0

經過多次閱讀並嘗試利用我多年來積累的舊調試器知識後,我設法實現了這一目標。它缺乏優化,但現在,我很高興。這可以被認爲是窮人的調試器,它利用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擴展的力量!