2011-08-12 2 views
4

別の監視プロセスの監視でマルチスレッドアプリケーションを実行することに興味があります。監視プロセスは、監視対象アプリケーション内のすべてのスレッドのCPUレジスタを取得および設定できる必要があります。私は単一のスレッドアプリケーションのためにこれを行う方法を知っています。しかし、私はマルチスレッドアプリケーションのためにこれをどのように拡張するかを知ることに興味があります。ptraceを使用して複数のスレッドのCPUレジスタを取得して設定する

+0

非常に難しい質問をしたようです。 – MetallicPriest

答えて

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()を使ってスレッドレジスタの詳細を取得するにはどうすればいいですか?

関連する問題