別の監視プロセスの監視でマルチスレッドアプリケーションを実行することに興味があります。監視プロセスは、監視対象アプリケーション内のすべてのスレッドのCPUレジスタを取得および設定できる必要があります。私は単一のスレッドアプリケーションのためにこれを行う方法を知っています。しかし、私はマルチスレッドアプリケーションのためにこれをどのように拡張するかを知ることに興味があります。ptraceを使用して複数のスレッドのCPUレジスタを取得して設定する
4
A
答えて
0
ptraceでは、pidの代わりにスレッドIDを使用できます。正常に動作するはずです。しかし、スレッド管理はあなたによって行われる必要があります。
+0
だから、それぞれのスレッドをwaitpidを使って別々に取得したり、それらのレジスタを変更するのを待たなければなりませんか? – MetallicPriest
0
ptraceでpidの代わりにスレッドIDを使用することは解決策ではありません。 Linux-64では、pthread_t - unsigned long、pid_t - unsigned intです。 私はこの問題も疑問に思いました。 gdbを使ってthread-reg-infoを取得する別の方法があります。私は、これはあなたを助けることを願っています
(gdb) info thread
2 Thread 0x7ffff7fe9700 (LWP 4533) 0x00000033d98ab91d in nanosleep() from /lib64/libc.so.6
* 1 Thread 0x7ffff7feb720 (LWP 4530) 0x00000033d9c080ad in pthread_join() from /lib64/libpthread.so.0
(gdb) info reg
rax 0xfffffffffffffe00 -512
...
rip 0x33d9c080ad 0x33d9c080ad <pthread_join+269>
eflags 0x246 [ PF ZF IF ]
...
(gdb) thread 2
[Switching to thread 2 (Thread 0x7ffff7fe9700 (LWP 4533))]#0 0x00000033d98ab91d in nanosleep() from /lib64/libc.so.6
(gdb) info thread
* 2 Thread 0x7ffff7fe9700 (LWP 4533) 0x00000033d98ab91d in nanosleep() from /lib64/libc.so.6
1 Thread 0x7ffff7feb720 (LWP 4530) 0x00000033d9c080ad in pthread_join() from /lib64/libpthread.so.0
(gdb) info reg
rax 0xfffffffffffffdfc -516
...
rip 0x33d98ab91d 0x33d98ab91d <nanosleep+45>
eflags 0x293 [ CF AF SF IF ]
...
:
void *ThrFunc(void *para)
{
printf("hello world.\n");
sleep(-1); // suspend the thread.
}
int main()
{
pthread_t ptid;
int ret = pthread_create(&ptid, NULL, ThrFunc, NULL);
if(ret != 0)
{
exit(errno);
}
pthread_join(ptid, NULL);// suspend the main thread.
return 0;
}
次は、GDBデバッグの詳細です: は、これは私のコードです。 ところで、ptrace()を使ってスレッドレジスタの詳細を取得するにはどうすればいいですか?
関連する問題
- 1. asm命令を使用してMIPS CPUレジスタを読み取る
- 2. Linuxカーネルを再コンパイルして特定のCPUレジスタを使用しない
- 3. Android SQLが複数の行を取得して設定する
- 4. シェルスクリプト - CPU使用率(%cpu)を取得して変数に保存する
- 5. OperatingSystemMXBeanを使用してCPU使用率を取得する
- 6. powershellを使用して特定のプロセスのCPU%を取得する
- 7. C++ CPUレジスタの使用
- 8. レジスタを使用した入力設定
- 9. タスクセットを使用してCPUアフィニティを設定する
- 10. スケーラビリティオプションを使用して複数のMySQLデータベースを設定する
- 11. Yii2 swiftmailerを使用して複数のメールコンポーネントを設定する
- 12. オートコンプリートを使用して複数のテキストボックスを設定する
- 13. javascriptを使用して複数のIDを取得する
- 14. バイナリマスクを使用して複数のデータフレーム(セグメント)を取得する
- 15. PythonでCPUレジスタの状態を取得するには?
- 16. JsonPathを使用してオブジェクトを取得/設定するC#
- 17. gitpythonを使用してuser.email設定を取得するには?
- 18. プロパティと定数の相違を設定して取得する
- 19. jamod apiを使用してmodbusレジスタから浮動小数点値を取得
- 20. chrome.tabs.executeScriptを使用して複数選択フィールドを設定する
- 21. Laravel 5.2:複数の変数を使ってセッションを設定して取得する
- 22. 複数のCPUを使用しているPythonを停止します
- 23. LOG4J2 Javaを使用して複数の設定ファイルを使用する
- 24. ジェンキンスを使用してGithubプルリクエストを複数回取得する
- 25. オープンソースツールを使用してプロセスCPU、メモリ使用率を取得する方法
- 26. 反応とノードを使用してCPU使用率データを取得する
- 27. スレッドを使用してグリッドビューにデータを設定する
- 28. phpを使用して複数のテキストファイルにメニューリストを設定
- 29. 複数の受信者を使用してPayPalを設定
- 30. スレッドを使用してサブ配列を取得する方法
非常に難しい質問をしたようです。 – MetallicPriest