/proc/ を使用してサブタスク(スレッド)のスタックを見つける方法/マップ?

/proc/ を使用してサブタスク(スレッド)のスタックを見つける方法/マップ?

目的:

Linux環境でポインタスキャナを作成する方法を理論化しています。

婦人声明:

私の結果は、Debian Bookworm(現在の安定版)とカスタムカーネルを持つGentooシステムでテストされました。違いは観察されなかった。

質問:

ターゲットプロセスにデバッガを接続せずに、各スレッド/サブタスクスタックのVMAを識別できることを願っています。これは以下を使用して可能でなければなりませんプロセス擬似ファイルシステム

議論する:

Linux 4.5より前は、パス名フィールドに親ジョブのスタック領域が表示され/proc/[parent_tid]/maps、各子ジョブのスタック領域はとしてマークされていました。[STACK][STACK:child_tid]

Linux 4.5以降では、親ジョブのスタック領域のみがその[STACK]ラベルを保持します。これで、子タスクスタック領域にラベルがありません。この変更に関するコミットメッセージ(リンク1を参照)では、Johannes WeinerはVMAのフローチャートを観察してサブタスクスタックを表示できると述べました/proc/[parent_tid]/task/[child_tid]/maps

これは私にとって効果的ではないことが判明しました。親ジョブと子ジョブのメモリー領域マッピングは同じです。/proc/[parent_tid]/maps== /proc/[parent_tid]/task/[child_tid*]/maps。これは、最終的に[STACK]ラベルが同じ領域に配置されることを意味します。

/proc/[tid]/stat特定のタスクのスタックの下部でVMAを見つけるために使用できます。これは28番目の値です(man 5 procを参照)。再び、/proc/[parent_tid]/stat/proc/[parent_tid]/task/[child_tid*]/stat明らかに、サブタスクはプロセスの他のすべてのタスクとスタックの先頭を共有しません。

clone(2)、スタックポインタをパラメータとして新しいサブタスクを作成するために使用されるシステムコール。スタックメモリを取得する最も確実な方法は、匿名性を利用することですmmap(2)。 NETの匿名メモリマッピング/proc/[tid]/mapsいくつかのシングルスレッドプロセスとマルチスレッドプロセスを観察すると、匿名メモリマッピングの数とプログラムのスレッド数との間に直接相関があります。このタイプのマッピングはスレッドスタックにのみ適用されませんが、スレッドスタックがこのように割り当てられていることを願っています。各メモリマップには/proc/[tid]/maps。これらのどれがサブタスクスタックとして機能するかを確認する方法はありますか?

私はここで何を間違えましたか?


関連リンク:

  1. [STACK:tid]以下からタグを削除することをお約束します/proc/[tid]/maps
    https://lists.ubuntu.com/archives/kernel-team/2016-March/074681.html

答え1

Field 28はLinux 6.1.0で動作します。タスクは、必要がない限り、独自のスタックを持たない。

以下は、さまざまな下部スタック値を返す必要がある単純な実行スクリプトです。一部仕事。 Firefoxをダウンロード/インストールする必要があるかもしれません。

#!/bin/bash

# create a temporary profile
test -d /tmp/temporary_profile || mkdir /tmp/temporary_profile

# run Firefox on that profile
firefox --profile /tmp/temporary_profile &

# Give it some time to create the tasks
sleep 10

# Get the PID
FFPID=$!

# Print field 28 of the stat files
awk '{print FILENAME" "$28}' /proc/$FFPID/stat /proc/$FFPID/task/*/stat

Firefoxを実行している場合は、次の行を実行して現在のプロセスIDを入力できます。

read a;awk '{print FILENAME" "$28}' /proc/$a/stat /proc/$a/task/*/stat

他のマルチスレッドプログラムでも動作しますが、Firefoxはほとんどすぐに独自のスタックでいくつかのタスクを生成するので、コードが正しく機能していることを確認するのに役立ちます。

関連情報