Как я могу приостановить выполнение программы pthread, чтобы я мог проверить pid и tgid потоков? - PullRequest
0 голосов
/ 01 января 2019

Я пытаюсь с небольшой программой из Различие между процессами и потоками в Linux

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <pthread.h>

void* threadMethod(void* arg)
{
    int intArg = (int) *((int*) arg);

    int32_t pid = getpid();
    uint64_t pti = pthread_self();

    printf("[Thread %d] getpid() = %d\n", intArg, pid);
    printf("[Thread %d] pthread_self() = %lu\n", intArg, pti);
}

int main()
{
    pthread_t threads[2];

    int thread1 = 1;

    if ((pthread_create(&threads[0], NULL, threadMethod, (void*) &thread1))
         != 0)
    {
        fprintf(stderr, "pthread_create: error\n");
        exit(EXIT_FAILURE);
    }

    int thread2 = 2;

    if ((pthread_create(&threads[1], NULL, threadMethod, (void*) &thread2))
         != 0)
    {
        fprintf(stderr, "pthread_create: error\n");
        exit(EXIT_FAILURE);
    }

    int32_t pid = getpid();
    uint64_t pti = pthread_self();

    printf("[Process] getpid() = %d\n", pid);
    printf("[Process] pthread_self() = %lu\n", pti);

    if ((pthread_join(threads[0], NULL)) != 0)
    {
        fprintf(stderr, "Could not join thread 1\n");
        exit(EXIT_FAILURE);
    }

    if ((pthread_join(threads[1], NULL)) != 0)
    {
        fprintf(stderr, "Could not join thread 2\n");
        exit(EXIT_FAILURE);
    }

    return 0;
}

На 64-битном Lubuntu 18.04 я скомпилирую его той же командой из поста:

$ gcc -pthread -o thread_test thread_test.c

Я также стараюсь следовать тому, что говорится в посте:

Используя блокировку планировщика в gdb, я могу поддерживать программу и ее потоки живыми, чтобы я мог захватить верх

но поскольку я не знаком с gdb, программа запускается без остановки (см. Ниже).Я также пытался установить точку останова на break 43, но GDB говорит No line 40 in the current file.Что мне сделать, чтобы приостановить выполнение, чтобы я мог использовать top или ps для проверки pid и tgid потоков?

$ gdb thread_test
GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from thread_test...(no debugging symbols found)...done.
(gdb) set scheduler-locking
Requires an argument. Valid arguments are off, on, step, replay.
(gdb) set scheduler-locking on
Target 'exec' cannot support this command.
(gdb) run
Starting program: /tmp/test/pthreads/thread_test 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[New Thread 0x7ffff77c4700 (LWP 4711)]
[New Thread 0x7ffff6fc3700 (LWP 4712)]
[Thread 1] getpid() = 4707
[Thread 1] pthread_self() = 140737345505024
[Process] getpid() = 4707
[Process] pthread_self() = 140737353951040
[Thread 0x7ffff77c4700 (LWP 4711) exited]
[Thread 2] getpid() = 4707
[Thread 2] pthread_self() = 140737337112320
[Thread 0x7ffff6fc3700 (LWP 4712) exited]
[Inferior 1 (process 4707) exited normally]
(gdb) 

Ответы [ 2 ]

0 голосов
/ 01 января 2019

ниже приведен пример использования gdb с опубликованным кодом для приостановки всего:

примечание: это было скомпилировано для поиска / устранения проблем компиляции через:

gcc -ggdb -Wall -Wextra -Wconversion -pedantic -std=gnu11 -c untitled.c

thisбыл наконец скомпилирован / связан через:

gcc -ggdb -Wall -o untitled untitled.c   -lpthread 

, затем с помощью отладчика: gdb, таким образом, показывая мои входы и gdb выходы:

$ gdb untitled
GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from untitled...done.
(gdb) br main
Breakpoint 1 at 0x9a5: file untitled.c, line 20.
(gdb) br threadMethod
Breakpoint 2 at 0x946: file untitled.c, line 9.
(gdb) r
Starting program: /home/richard/Documents/forum/untitled 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, main () at untitled.c:20
20  {
(gdb) c
Continuing.
[New Thread 0x7ffff77c4700 (LWP 8645)]
[New Thread 0x7ffff6fc3700 (LWP 8646)]
[Switching to Thread 0x7ffff77c4700 (LWP 8645)]

Thread 2 "untitled" hit Breakpoint 2, threadMethod (arg=0x7fffffffdf4c)
    at untitled.c:9
9       int intArg = (int) *((int*) arg);
(gdb) 

, затем вы можете (вдругое окно терминала) используйте ps и т. д. для отображения информации.Тем не менее, функция потока выведет (на stdout информацию, которая может вас заинтересовать.

или вы можете (в gdb введите такие команды, как:

(gdb) c
[Process] getpid() = 8641
[Process] pthread_self() = 140737353992000
[Switching to Thread 0x7ffff6fc3700 (LWP 8646)]

Thread 3 "untitled" hit Breakpoint 2, threadMethod (arg=0x7fffffffdf50)
at untitled.c:9
9       int intArg = (int) *((int*) arg);
(gdb) c
....
[Thread 1] getpid() = 8641
[Thread 1] pthread_self() = 140737345505024
....
[Thread 2] getpid() = 8641
[Thread 2] pthread_self() = 140737337112320
0 голосов
/ 01 января 2019

У вас есть две проблемы:

  • вы создали свою программу без отладочной информации (добавьте флаг -g), и
  • вы пытаетесь set scheduler-locking on до запуска программы(это не работает).

Это должно работать:

 gcc -g -pthread -o thread_test thread_test.c
 gdb -q ./thread_test
 (gdb) start
 (gdb) set scheduler-locking on

Однако вы должны быть очень осторожны с этим параметром - простое продолжение с этого момента поможет вампрограмма для блокировки в pthread_join, так как только основной поток продолжит работу.

...