我有兴趣在另一个监控过程的监督下运行多线程应用程序。监视进程应该能够获取和设置受监视应用程序中所有线程的CPU寄存器。我知道如何为单线程应用程序执行此操作。但我很想知道如何为多线程应用程序扩展它。
答案 0 :(得分:0)
您可以在ptrace中使用线程ID而不是pid,它应该可以正常工作。但是线程管理需要由您完成。
答案 1 :(得分:0)
在ptrace中使用线程ID而不是pid,不是解决方案。 因为在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()获取线程寄存器的详细信息?