6

組み込みの powerpc ターゲットで gdb 7.4.1 を使用して、pthreads を使用するマルチスレッド C++ プログラムで分析を実行しています。私の最終目標は、Python で gdb のスクリプトを作成して、いくつかの一般的な分析機能を自動化することです。問題は、コマンドを個別に実行する場合と gdb ユーザー定義コマンドで実行する場合 (または python スクリプトを介して同じコマンドを呼び出す場合) の動作に矛盾があることです。

編集:メインの gdb メーリング リストで、非常によく似た問題へのこの参照を見つけました。非同期モードの制限に関する Pedro の回答に完全に従っているわけではありませんが、非同期モードでは、ユーザー定義のコマンド シーケンスの相対的なタイミングが信頼できないことを暗示していると思います。これは私が経験的に見つけたものです。

どちらのシナリオでも、次の起動手順を実行し、プログラムをロードしてその引数を設定し、非同期およびノンストップ デバッグ モードをオンにしてから、プログラムをバックグラウンドで実行します。

(gdb) file myprogram
(gdb) set args --interface=eth0 --try-count=0
(gdb) set target-async on
(gdb) set pagination off
(gdb) set non-stop on
(gdb) run &

この時点で、手動でコマンドを発行するinterruptと、info threads停止したスレッドを除く、実行中のすべてのスレッドのリストが表示されます。それから私はcontinue &心のコンテンツを繰り返すことができます.それは一貫して機能します. 停止すると、そのスレッドのスタック フレームを調べることができ、すべて問題ありません。

ただし、代わりにこれらのコマンドをユーザー定義の gdb コマンドに入れると:

(gdb) define foo
(gdb) interrupt
(gdb) info threads
(gdb) continue &
(gdb) end
(gdb) foo
Cannot execute this command while the selected thread is running.

次に、foo によって出力されたスレッド リストは、停止されたスレッドがないことを示しているため、continue &コマンドは を返しますCannot execute this command while the selected thread is running.。これは非同期の gdb コマンドに固有の問題だと思ったので、割り込みコマンドの後に途方もなく長い待機時間を挿入したところ、同じ動作が得られました。

(gdb) define foo
(gdb) interrupt
(gdb) shell sleep 5
(gdb) info threads
(gdb) continue &
(gdb) end
(gdb) foo
Cannot execute this command while the selected thread is running.

sleep コマンドの有無にかかわらず、いつでも手動の CLI コマンドを発行でき、スレッドは正しく停止されます。

同様に、Python スクリプトをソースとしてスレッドの閲覧を行っても同じ結果が得られます。

import gdb, time

gdb.execute("file myprogram")
gdb.execute("set args --interface=eth0 --try-count=0")
gdb.execute("set target-async on")
gdb.execute("set pagination off") 
gdb.execute("set non-stop on")
gdb.execute("run &")
time.sleep(5)
gdb.execute("interrupt")

# here, I inspect threads via gdb module interface
# in practice, they're always all running bc the program neven got interrupted
for thread in gdb.selected_inferior().threads():
    print thread.is_running(),

gdb.execute("continue &")

from_tty=True呼び出しで指定しても同じ結果が得られgdb.executeます。また、使用するcontinue -aとエラー文字列が抑制されますが、それ以外の場合は役に立ちません。割り込み呼び出しはまだ機能しません。

だから...これは:

  • コクピットエラー?私が達成しようとしていることを考えると、私が省略している、または間違っていることはありますか? これは機能するはずですか、それとも GDB/MI を使用して gdb をこのように非同期に「駆動」する必要がありますか?
  • タイミングの問題?このコンテキストでは、呼び出しshell sleep(またはpython time.sleep()) は、私が想定していることを実行しない可能性があります。
  • pthread の使用方法に問題がありますか? 手動の gdb コマンドを使用すると常に正しく機能するため、これは当てはまらないと思います。
  • gdbの問題?

ありがとう。

4

1 に答える 1