получение и настройка регистров процессора нескольких потоков с использованием ptrace - PullRequest
4 голосов
/ 12 августа 2011

Я заинтересован в запуске многопоточного приложения для наблюдения за другим процессом мониторинга. Процесс мониторинга должен иметь возможность получать и устанавливать регистры ЦП всех потоков в отслеживаемом приложении. Я знаю, как это сделать для однопоточного приложения. Но мне интересно знать, как расширить это для многопоточных приложений.

Ответы [ 2 ]

0 голосов
/ 10 июля 2013

Использование идентификатора потока вместо pid в ptrace не является решением. Потому что в Linux-64 pthread_t - unsigned long, pid_t - unsigned int. Я тоже задумался над этим вопросом. У меня есть другой способ получить информацию о потоке-рег, используя gdb. Это мой код:

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 () для получения подробных регистров потока?

0 голосов
/ 13 августа 2011

Вы можете использовать идентификатор потока вместо pid в ptrace, и он должен работать нормально. Однако управление потоками должно выполняться вами.

...