4

別の監視プロセスの監視下でマルチスレッド アプリケーションを実行することに関心があります。監視プロセスは、監視対象アプリケーションのすべてのスレッドの CPU レジスタを取得および設定できる必要があります。シングルスレッドアプリケーションでこれを行う方法を知っています。しかし、これをマルチスレッド アプリケーション用に拡張する方法を知りたいと思っています。

4

2 に答える 2

0

ptrace で pid の代わりにスレッド ID を使用することは解決策ではありません。Linux-64 では、pthread_t--unsigned long、pid_t--unsigned int. この問題も気になりました。gdb を使用して、thread-reg-info を取得する別の方法があります。これは私のコードです:

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 デバッグの詳細です。

(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 ]
...

これがお役に立てば幸いです。ところで、私も知りたいです: ptrace() を使用してスレッド レジスタの詳細を取得する方法は?</p>

于 2013-07-10T03:28:48.627 に答える
0

ptrace で pid の代わりにスレッド ID を使用でき、正常に動作するはずです。ただし、スレッド管理は自分で行う必要があります。

于 2011-08-13T04:28:57.993 に答える