Хорошо, это действительно волнует меня. У меня есть следующая функция, которая просто считывает ввод и возвращает строкуОшибка сегментации от функции, которая вообще не называется
unsigned char* readFromIn() {
unsigned char* text = malloc(1024);
if (fgets(text, 1024, stdin) != NULL) { <--This is what's causing segmentation fault
int textLen = strlen(text);
if (textLen > 0 && text[textLen - 1] == '\n')
text[textLen - 1] = '\0'; // getting rid of newline character
return text;
}
else {
free(text);
return NULL;
}
}
Вещи, эта функция не вызывается в любом месте и просто, чтобы подтвердить, я изменил имя функции на что-то сумасшедшее, как 9rawiohawr90awrhiokawrioawr и поставить printf в верхней части функции.
Я искренне не знаю, почему некорректная функция может вызвать ошибку ошибки сегментации.
Я использую gcc 4.6.3 на ubuntu.
Edit: Я знаю, что линия
if (fgets(text, 1024, stdin) != NULL) {
это код обижая, потому что, как только я закомментировать, что условное, не происходит ошибка сегментации.
Я знаю, что функция NOT вызывается, потому что я не вижу вывода отладочного заявления printf, которое я поставил.
Редактировать 2: Я попытался изменить тип от unsigned char до char. Еще ошибка сегментации. Я попытаюсь получить выход gdb.
Edit3: GDB трассировки производится следующий
#0 0xb7fa5ac2 in _IO_2_1_stdin_() from /lib/i386-linux-gnu/libc.so.6
#1 0xb7faf2fb in libwebsocket_create_context (info=0xbffff280) at libwebsockets.c:2125
#2 0x0804a5bb in main()
делает кадр 0,1,2 не выводит ничего интересного, в частности.
Edit4: Я пробовал все предложения в комментарии, но безрезультатно, я все равно получаю ту же ошибку сегментации.
Итак, я установил новую копию Ubuntu на виртуальную ОС и перекомпилировал свой код. По-прежнему такая же проблема. Мне кажется, что проблема заключается в том, что какая-то неизвестность происходит в моем коде или самой библиотеке. Я создал минимальный пример, иллюстрирующий проблему:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libwebsockets.h>
unsigned char* readFromIn() {
unsigned char* text = malloc(1024);
if (fgets(text, 1024, stdin) != NULL) { <--SEGMENTATION FAULT HERE
int textLen = strlen(text);
if (textLen > 0 && text[textLen - 1] == '\n')
text[textLen - 1] = '\0';
return text;
}
else {
free(text);
return NULL;
}
}
int callback_http(struct libwebsocket_context *context,
struct libwebsocket *wsi,
enum libwebsocket_callback_reasons reason, void *user,
void *in, size_t len)
{
return 0;
}
static struct libwebsocket_protocols protocols[] = {
/* first protocol must always be HTTP handler */
{
"http-only", // name
callback_http, // callback
0 // per_session_data_size
}
};
int main(void) {
printf("Initializing Web Server\n");
// server url will be http://localhost:8081
int port = 8081;
const char *interface = NULL;
struct libwebsocket_context *context;
// we're not using ssl
const char *cert_path = NULL;
const char *key_path = NULL;
// no special options
int opts = 0;
struct lws_context_creation_info info;
memset(&info, 0, sizeof info);
info.port = port;
info.iface = interface;
info.protocols = protocols;
info.extensions = libwebsocket_get_internal_extensions();
info.ssl_cert_filepath = NULL;
info.ssl_private_key_filepath = NULL;
info.gid = -1;
info.uid = -1;
info.options = opts;
context = libwebsocket_create_context(&info);
if (context == NULL) {
fprintf(stderr, "libwebsocket init failed\n");
return 0;
}
printf("starting server...\n");
while (1) {
libwebsocket_service(context, 50);
}
printf("Shutting server down...\n");
libwebsocket_context_destroy(context);
return 0;
}
И вот как я собрал мой код
gcc -g testbug.c -o test -lwebsockets
Вот библиотека Я использую
http://git.libwebsockets.org/cgi-bin/cgit/libwebsockets/tag/?id=v1.23-chrome32-firefox24
Вы будете см., что я еще не вызываю функцию readFromIn(), ошибка сегментации возникает, как только вы пытаетесь запустить исполняемый файл.
Я повторно запустил gdb, и на этот раз backtrace и рамки расскажут мне немного больше информации.
(gdb) run
Starting program: /home/l46kok/Desktop/websocketserver/test
Initializing Web Server
[1384002761:2270] NOTICE: Initial logging level 7
[1384002761:2270] NOTICE: Library version: 1.3 unknown-build-hash
[1384002761:2271] NOTICE: Started with daemon pid 0
[1384002761:2271] NOTICE: static allocation: 4448 + (12 x 1024 fds) = 16736 bytes
[1384002761:2271] NOTICE: canonical_hostname = ubuntu
[1384002761:2271] NOTICE: Compiled with OpenSSL support
[1384002761:2271] NOTICE: Using non-SSL mode
[1384002761:2271] NOTICE: per-conn mem: 124 + 1360 headers + protocol rx buf
[1384002761:2294] NOTICE: Listening on port 8081
Program received signal SIGSEGV, Segmentation fault.
0xb7fb1ac0 in _IO_2_1_stdin_() from /lib/i386-linux-gnu/libc.so.6
(gdb) backtrace
#0 0xb7fb1ac0 in _IO_2_1_stdin_() from /lib/i386-linux-gnu/libc.so.6
#1 0xb7fcc2c6 in libwebsocket_create_context() from /usr/local/lib/libwebsockets.so.4.0.0
#2 0x080488c4 in main() at testbug.c:483
(gdb) frame 1
#1 0xb7fcc2c6 in libwebsocket_create_context() from /usr/local/lib/libwebsockets.so.4.0.0
(gdb) frame 2
#2 0x080488c4 in main() at testbug.c:483
483 context = libwebsocket_create_context(&info);
Так что да .. Я думаю, что я дал всю информацию под рукой .. но я действительно не уверен, что проблема есть. Программа вызывает ошибку сегментации в строке 483, но проблема исчезла, когда я прокомментирую нарушающую функцию, которая не вызывается.
Вы попробовали 'make clean; make'? –
И вы знаете, что это называется, потому что вы видите вывод из 'printf'? Вероятно, это поможет, если мы увидим больше соответствующего кода. –
Постройте с помощью отладочной информации и запустите в отладчике. Он остановится при сбое, и вы сможете увидеть стек вызовов функций. И если стек вызовов выглядит «странным» (пожалуйста, отредактируйте свой вопрос, чтобы включить его), тогда, скорее всего, у вас есть проблема с разбивкой стека. –