Этот вопрос относится к gdb и valgrind в make-файле . Я нашел причину ошибки сегментации, как указано в предыдущем разделе, и теперь я не знаю, как решить эту проблему. Извините, я не смогу опубликовать код, так как он распространяется по нескольким файлам и, следовательно, имеет тенденцию быть довольно большим.
смотрит на Makefile
all: clients.so simulator backup
LD_PRELOAD=/home/Juggler/client/clients.so ./simulator
backup: backup.c libclient.a
gcc backup.c -o backup -L /home/Juggler/client -L. -lclient -ldl
simulator: simulator.c libclient.a
gcc -g simulator.c -o simulator -L /home/Juggler/client -L. -lclient -ldl -pthread
libclient.a: libclient.o client.o
ar rcs libclient.a libclient.o client.o
libclient.o:libclient.c
gcc -c libclient.c -o libclient.o -pthread
clients.so: client.o client_invoke.o
ld -shared -o clients.so client_invoke.o client.o -ldl
client_invoke.o: client_invoke.c
gcc -Wall -fPIC -DPIC -c -g client_invoke.c
client.o: client.c
gcc -Wall -fPIC -DPIC -c -g client.c -ldl -pthread
Симулятор запускает несколько потоков, и каждый поток сначала использует функции из libclient.a для достижения client.c, где устанавливается соединение с сервером через сокеты. Каждый поток подключен к серверу через отдельный сокет и использует pthread_keycreate и его семейство функций для сохранения специфичности потока значения сокета. Другие вызовы из каждого потока (open, read и т. Д.) Проходят через общую библиотеку client.so, которая была предварительно загружена, а затем в client.c для отправки сообщения на сервер через специальный сокет потока.
Теперь проблема заключается в том, что любое сообщение серверу из потока, который проходит по маршруту через libclient.a, использует специфичный для потока сокет, но любое сообщение, которое проходит по маршруту через client.so, в общей библиотеке встречается ошибка сегментации при send () , Я попытался распечатать дескриптор сокета, и он печатает по первому маршруту, но не по второму ... В операторе печати возникает ошибка.
Работают ли специфичные для потока данные и общая библиотека?
Спасибо
Редактировать: код внутри и вокруг segfault
int call_execute(char *argcalls[])
{
int *saved_socket;
saved_socket = (int*)pthread_getspecific(key_to_sockfd);
.....
n = send(*saved_sockfd,argcalls[i],strlen(argcalls[i]),0);//segfault here.argcalls[i] not giving segfault
...
}
Был бы рад уточнить. call_execute вызывается из client_invoke, когда происходит ошибка. Но когда он вызывается из libclient.c, он работает нормально.