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);) все работает чудно(но переменая мне в дальнейшем нужна). не могу понять что с ней и как профиксить.И вообще как от нее зависит умирания всего.
Заранее большое спасибо!


Re: Segmentation fault

> fprintf(stdout,i)

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

printf("%d", i);

kemm ()

Re: Segmentation fault

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


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

-O0 -g -Wall

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

ulimit -c 65000

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

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

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

gdb program core

вводите bt (backtrace)

bt

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

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




Sylvia ★★★★★ ()
Ответ на: Re: Segmentation fault от kemm

Re: Segmentation fault

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

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

:)

Cy6erBr4in ★★★ ()
Ответ на: Re: Segmentation fault от Cy6erBr4in

Re: Segmentation fault

найдет где падает и начнет ;)

Sylvia ★★★★★ ()

Re: Segmentation fault

>fprintf(stdout,i);

А формат где?

legolegs ★★★★★ ()

Re: Segmentation fault

> [root@centos socket2]#

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

kemm ()
Ответ на: Re: Segmentation fault от Cy6erBr4in

Re: Segmentation fault

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

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

legolegs ★★★★★ ()
Ответ на: Re: Segmentation fault от legolegs

Re: Segmentation fault

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

Cy6erBr4in ★★★ ()
Ответ на: Re: Segmentation fault от kemm

Re: Segmentation fault

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

Sylvia ★★★★★ ()
Ответ на: Re: Segmentation fault от Sylvia

Re: Segmentation fault

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

ltrace и systemtap :)

mv ★★★★★ ()
Ответ на: Re: Segmentation fault от Cy6erBr4in

Re: Segmentation fault

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

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

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

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

legolegs ★★★★★ ()
Ответ на: Re: Segmentation fault от legolegs

Re: Segmentation fault

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

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

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

Cy6erBr4in ★★★ ()
Ответ на: Re: Segmentation fault от Cy6erBr4in

Re: Segmentation fault

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

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

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

legolegs ★★★★★ ()
Ответ на: Re: Segmentation fault от legolegs

Re: Segmentation fault

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

... -> 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 ★★★ ()
Ответ на: Re: Segmentation fault от Cy6erBr4in

Re: Segmentation fault

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

-> 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 ★★★ ()
Ответ на: Re: Segmentation fault от kemm

Re: Segmentation fault

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

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

true_admin ★★★★★ ()
Ответ на: Re: Segmentation fault от Cy6erBr4in

Re: Segmentation fault

>test.c:109: warning

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

legolegs ★★★★★ ()
Ответ на: Re: Segmentation fault от true_admin

Re: Segmentation fault

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

Sylvia ★★★★★ ()
Ответ на: Re: Segmentation fault от true_admin

Re: Segmentation fault

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

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

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