Почему Cygwin GDB имеет проблемы с отладкой программы с потоками? - PullRequest
0 голосов
/ 19 октября 2019

У меня возникают проблемы при отладке программ с потоками в Cygwin.

Когда следующая программа получает вызов pthread_create(), сеанс отладки получает неизвестное целевое исключение, по-видимому, при вызове ntdll!RtlAllocateHeap().

Я знаю, что в прошлом я мог отлаживать потоки в Eclipse - есть ли какие-то новые секретные настройки, которые я пропустил, или это проблема с Eclipse?

Для записи, яя использую Cygwin64 (CYGWIN_NT-6.1) с gcc 7.4.0 / gdb 8.1.1 / Eclipse 4.13.0.

Программы работают нормально при запуске непосредственно из командной строки. Я также могу запустить программу в GDB и выполнять инструкции до тех пор, пока она не достигнет вызова pthread_create().

Сессия GDB:

jay.elston@M4800-1RBTK12 ~/threadTest
$ cc -g threads.c

jay.elston@M4800-1RBTK12 ~/threadTest
$ gdb a.exe
GNU gdb (GDB) (Cygwin 8.1.1-1) 8.1.1
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-pc-cygwin".
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 a.exe...done.
(gdb) b 13
Breakpoint 1 at 0x10040108c: file threads.c, line 13.
(gdb) run
Starting program: /home/jay.elston/threadTest/a.exe
[New Thread 624.0xebc]
[New Thread 624.0x2ef0]
[New Thread 624.0x1b24]
[New Thread 624.0x1074]
[New Thread 624.0x2088]
[New Thread 624.0x2710]
[New Thread 624.0x2a1c]
gdb: unknown target exception 0x80000001 at 0x77a97b97

Thread 7 received signal ?, Unknown signal.
[Switching to Thread 624.0x2a1c]
0x0000000077a97b97 in ntdll!RtlAllocateHeap ()
   from /cygdrive/c/Windows/SYSTEM32/ntdll.dll
(gdb)c
Continuing.
[New Thread 624.0x2374]
[Thread 624.0x2710 exited with code 2147483649]
[Thread 624.0x2a1c exited with code 2147483649]
[Thread 624.0x2088 exited with code 2147483649]
[Thread 624.0x1b24 exited with code 2147483649]
[Thread 624.0x1074 exited with code 2147483649]
[Thread 624.0x2374 exited with code 2147483649]
[Inferior 1 (process 624) exited with code 020000000001]
(gdb) quit

jay.elston@M4800-1RBTK12 ~/threadTest
$ ./a.exe
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Программа:

// Start a thread using pthread_create
#include <stdio.h>
#include <errno.h>
#include <time.h>
#include <string.h>
#include <pthread.h>

void *fifteenSeconds(void *arg)
{
    struct timespec sleepTime;
    struct timespec sleptTime;

    int i = 0;

    while ( i++ < 15 ) {
        printf("%d\n", i);
        sleepTime.tv_sec = 01;
        sleepTime.tv_nsec = 000000000;
        nanosleep(&sleepTime, &sleptTime);
    }
    return (void *)0;
}

int main ( int argc, char *argv[] )
{
    pthread_t fifteenSecondsThreadId;

    int rc = 0;

    rc = pthread_create(&fifteenSecondsThreadId, (void *)0, &fifteenSeconds, (void *)0);
    if ( rc != 0 ) {
        fprintf(stderr, "(%s,%d): Error %d creating thread for io handler: %s\n"
                , __FILE__, __LINE__
                , errno, strerror(errno)
                );
        return rc;
    }

    pthread_join(fifteenSecondsThreadId, (void *)0);

    return 0;
}
...