2016-09-20 6 views
0

私はgdb内でpythonを使ってCをデバッグすることについてまだ学んでいます(私の場合はarm-none-eabi-gdb)。私はこの機能を使用して、ARM Cortex-M上で動作するリアルタイムOSのスレッド情報を取得しようとしています。いくつかのOS構造を読んで、私は OSのスレッド制御ブロックにアクセスできます。私は各スレッドのPCとSPを知っています。どうすればgdbのPythonを使ってスレッドのバックトレースをダンプすることができますか? PCとSPが与えられたときにスタックをトラバースできる汎用APIはありますか?gdbがOSに対応していないときにgdbのPythonを使用して異なるOSスレッドをバックトレースする

私はhttps://sourceware.org/gdb/current/onlinedocs/gdb/Unwinding-Frames-in-Python.html#Unwinding-Frames-in-Pythonを読みましたが、それを達成する方法があると感じていますが、私はいくつかの助けが必要です。

可能であれば、OSの異なるスレッドをgdbに認識させることはできますか?このリンク: https://sourceware.org/gdb/current/onlinedocs/gdb/Threads-In-Python.html#Threads-In-Pythonスレッドには触れますが、OS情報に依存します。これらは、それぞれの制御ブロックからの異なるOSスレッドについて私が知っているもので過負荷になる可能性がありますか?

ありがとうございます!

答えて

0

私が長年蓄積してきた古いデバッガの知識をもう少し読んでみると、私はこれを手に入れました。それは最適化が欠けているが、今のところ私はとても喜んでいる。これは、GDBのPythonサポートを利用して、システム内のアクティブなスレッドを追跡する、貧しい人のデバッガと見なすことができます。これは一般的なことですが、実装はRTX(KeilのOS)をターゲットにしていました。これはCortex-M0で機能しました。他のオペレーティングシステムや異なるコアに合わせるには、いくつかの調整が必要な場合があります。

主なアイデア:

  1. 使用OSの構造、スレッド制御ブロックが存在する場所を特定します。
  2. スレッド制御ブロックから、異なるスレッドスタックがどこにあるかを識別します。
  3. すべての重要なレジスタをスタックから読み出します。 SP、LR、およびPC
  4. 現在の実行中のスレッドと同じレジスタを保存します。
  5. 別のスレッドをループし、重要なレジスタをスレッドに一致するレジスタに変更し、バックトレースを出力します。
  6. 貧しい人のOS対応デバッガをお楽しみください。

スクリプトは、ここで見つけることができます:

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

GDBのPython拡張の力を探求するために非常に良い練習でした!

関連する問題