LINUX.ORG.RU

Segmentation fault


0

0

Помогите разобраться в чем проблема
вот код:
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <sys/un.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <mysql.h>
#include <string.h>

#define QUEUE_LENGTH 10
#define BUF_LEN 4096
#define SOCK_NAME "mysocket"
#define PORT 1081

int main (void)
{
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;

char *server = "localhost";
char *user = "root";
char *password = ""; /* set me first */
char *database = "messdb";

int sock, client_sock;
char * buf;
char * buffer[100];
char * mes;
int count;
struct sockaddr_in saddr;
int i=5;

sock = socket (PF_INET, SOCK_STREAM, 0);
if (sock == -1) {
fprintf (stderr, "socket() error\n");
return 1;
}
buf = (char *) malloc (BUF_LEN);
if (buf == NULL) {
fprintf (stderr, "malloc() error\n");
return 1;
}

saddr.sin_family = AF_INET;

saddr.sin_addr.s_addr = inet_addr("127.0.0.1");

saddr.sin_port = htons (PORT);
if (bind (sock, (struct sockaddr *) &saddr,
sizeof (saddr)) == -1) {
fprintf (stderr, "bind() error\n");
return 1;
}

if (listen (sock, QUEUE_LENGTH) == -1) {
fprintf (stderr, "listen() error\n");
return 0;
}

while (1) {
client_sock = accept (sock, NULL, NULL);

if (client_sock == -1) {
fprintf (stderr, "accept() error\n");
return 1;
}

if ((count = read (client_sock,
buf, BUF_LEN-1)) == -1) {
fprintf (stderr, "read() error\n");
return 1;
}

buf[count] = '\0';
//printf ("number for message %s\n", buf);

//in db mysql
conn = mysql_init(NULL);
/* Connect to database */
if (!mysql_real_connect(conn, server,
user, password, database, 0, NULL, 0)) {
fprintf(stderr, "%s\n", mysql_error(conn));
exit(1);
}

/* send SQL query */
//strcpy(buf_sql,"select * from message");
//strcat(buf_sql,buf);
//strcat(buf_sql,"\")");
//fprintf(stdout,buf_sql);
if (mysql_query(conn, "select * from message")) {
fprintf(stderr, "%s\n", mysql_error(conn));
exit(1);
}

if(!(res = mysql_store_result(conn)) && mysql_num_fields(conn))
{
fprintf(stderr, "error mysql_store_result\n");
}
/* output table name */
//printf("mysql result:\n");
while ((row = mysql_fetch_row(res)) != NULL)
{

write (client_sock, row[0], strlen (row[0]));
}
fprintf(stdout,i);
/* close connection */
mysql_free_result(res);
mysql_close(conn);
//in db end

close (client_sock);

if (!strcmp (buf, "exit")) break;
}

free (buf);
close (sock);
unlink (SOCK_NAME);
return 0;
}
Програма компилируеться: gcc -o socket2-server $(mysql_config --cflags) socket2-server.c $(mysql_config --libs)
После первой попытки конектиться клиенту получаем:
[root@centos socket2]# ./socket2-server
Segmentation fault
[root@centos socket2]#
Если закоментировать переменую "i"(2 строки:int i=5; и fprintf(stdout,i);) все работает чудно(но переменая мне в дальнейшем нужна). не могу понять что с ней и как профиксить.И вообще как от нее зависит умирания всего.
Заранее большое спасибо!


> fprintf(stdout,i)

Второй аргумент функции fprintf(3) -- char *. Ты туда передаёшь (char *)5.

printf("%d", i);

kemm
()

можно дать человеку рыбу и он будет сыт один раз..
но лучше научить его ловить рыбу -


собираете с флагами gcc

-O0 -g -Wall

выставляете в терминале положительный лимит на размер дампов core

ulimit -c 65000

для ~64 Mb дампов

запускаете программу, она падает, при падении образуется файл core

далее запускаете gdb

gdb program core

вводите bt (backtrace)

bt

видите где именно ваша программа упала, вплоть до номера строки

еще можете освоить strace




Sylvia ★★★★★
()
Ответ на: комментарий от kemm

Ну если уж ему так хочется fprintf сипользовать, мог бы хотя бы написать

fprintf (stdout, "%d", i);

:)

Cy6erBr4in ★★★
()

>fprintf(stdout,i);

А формат где?

legolegs ★★★★★
()

> [root@centos socket2]#

И да, я ещё раз повторю -- убей сибя ап стену. Для непонятливых -- под рутом работать нельзя. Тем более пишучи _такой_ код. 8)))

kemm
()
Ответ на: комментарий от Cy6erBr4in

>Да что уж вы так по зверски, пусть человек хоть доки по стандартным функциям читать начнет... :)

Да это от невнимательности. Хотяв другой язык бы на ошибку указал. А в целом код, конечно, лапша.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Язык тут не причем... если попросить, то и этот тебе корку аккуратно запишет (не сам язык, но не суть)... и смотри в ней что хошь :)

Cy6erBr4in ★★★
()
Ответ на: комментарий от kemm

омг.. и точно, я даже исходное сообщение не читала полностью,
ну зачем искать ошибки в чужом коде ? пусть автор самостоятельно учится искать их
при помощи gdb и strace , а то ведь ждите скоро еще одну тему с очередной писаниной

Sylvia ★★★★★
()
Ответ на: комментарий от Sylvia

> еще можете освоить strace

ltrace и systemtap :)

mv ★★★★★
()
Ответ на: комментарий от Cy6erBr4in

>Язык тут не причем...

Плюсы даже при ворнингах по умолчанию находят ошибку при компиляции:

<stdin>:109: ошибка: некорректное преобразование из ‘int’ в ‘const char*’

<stdin>:109: ошибка: при инициализации 2 -го аргумента ‘int fprintf(FILE*, const char*, ...)’

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

простите, но gcc у меня как бы тоже указывает явно где ошибка:

test.c:109: warning: passing argument 2 of 'fprintf' makes pointer from integer without a cast

так что не надо ляля :)

Cy6erBr4in ★★★
()
Ответ на: комментарий от Cy6erBr4in

>простите, но gcc у меня как бы тоже указывает явно где ошибка:

Да, но это с -Wall. А я скомпилировал с параметрами по умолчанию.

Естественно, -Wall и -Wextra рекомендуются.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Полный вывод:

... -> gcc test.c -o test test.c:8:19: error: mysql.h: No such file or directory test.c: In function 'main': test.c:18: error: 'MYSQL' undeclared (first use in this function) test.c:18: error: (Each undeclared identifier is reported only once test.c:18: error: for each function it appears in.) test.c:18: error: 'conn' undeclared (first use in this function) test.c:19: error: 'MYSQL_RES' undeclared (first use in this function) test.c:19: error: 'res' undeclared (first use in this function) test.c:20: error: 'MYSQL_ROW' undeclared (first use in this function) test.c:20: error: expected ';' before 'row' test.c:104: error: 'row' undeclared (first use in this function) test.c:109: warning: passing argument 2 of 'fprintf' makes pointer from integer without a cast

да, пакеты для мускуля у меня не установлены :)

Cy6erBr4in ★★★
()
Ответ на: комментарий от Cy6erBr4in

фак, форматирование!

-> gcc test.c -o test
test.c:8:19: error: mysql.h: No such file or directory
test.c: In function 'main':
test.c:18: error: 'MYSQL' undeclared (first use in this function)
test.c:18: error: (Each undeclared identifier is reported only once
test.c:18: error: for each function it appears in.)
test.c:18: error: 'conn' undeclared (first use in this function)
test.c:19: error: 'MYSQL_RES' undeclared (first use in this function)
test.c:19: error: 'res' undeclared (first use in this function)
test.c:20: error: 'MYSQL_ROW' undeclared (first use in this function)
test.c:20: error: expected ';' before 'row'
test.c:104: error: 'row' undeclared (first use in this function)
test.c:109: warning: passing argument 2 of 'fprintf' makes pointer from integer without a cast

Cy6erBr4in ★★★
()
Ответ на: комментарий от kemm

> И вообще, по-хорошему, код надо собирать с '-Wall -Werror' 8))

Я не рекомендую это делать потому что если у меня компилер отличный от компилера(например, gcc поновее/постарее) автора то с приличной вероятностью это не соберётся.

true_admin ★★★★★
()
Ответ на: комментарий от Cy6erBr4in

>test.c:109: warning

Действительно. Тогда остаётся гадать, как автор умудрился этот ворнинг прошляпить.

legolegs ★★★★★
()
Ответ на: комментарий от true_admin

я добавлю еще то , что куча мусора от warning (не говоря уже о том что при -Werror оно еще и не соберется) оставляет соответствующее впечатление об авторе,
когда делается релиз - лишние -W стоит убирать, кому нужно - сами добавят

Sylvia ★★★★★
()
Ответ на: комментарий от true_admin

> Я не рекомендую это делать потому что если у меня компилер отличный от компилера(например, gcc поновее/постарее) автора то с приличной вероятностью это не соберётся.

Так я и не говорил, что релиз должен по умолчанию собираться с -Werror. Но на этапе разработки способствует, да.

kemm
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.