서버 프로그래밍시 세그먼트 폴트(쓰레드로 작성)

stypr의 이미지

GNU gdb Red Hat Linux (5.2-2)
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux"...
Core was generated by `./server'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib/i686/libpthread.so.0...done.
Loaded symbols for /lib/i686/libpthread.so.0
Reading symbols from /usr/local/mysql/lib/mysql/libmysqlclient.so.10...done.
Loaded symbols for /usr/local/mysql/lib/mysql/libmysqlclient.so.10
Reading symbols from /lib/i686/libc.so.6...done.
Loaded symbols for /lib/i686/libc.so.6
Reading symbols from /usr/lib/libz.so.1...done.
Loaded symbols for /usr/lib/libz.so.1
Reading symbols from /lib/libcrypt.so.1...done.
Loaded symbols for /lib/libcrypt.so.1
Reading symbols from /lib/libnsl.so.1...done.
Loaded symbols for /lib/libnsl.so.1
Reading symbols from /lib/i686/libm.so.6...done.
Loaded symbols for /lib/i686/libm.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
#0  0x4207afcc in chunk_free () from /lib/i686/libc.so.6
(gdb) bt
#0  0x4207afcc in chunk_free () from /lib/i686/libc.so.6
#1  0x4207a70a in chunk_alloc () from /lib/i686/libc.so.6
#2  0x4207a158 in malloc () from /lib/i686/libc.so.6
#3  0x0804944d in serveIt ()
#4  0x4001ffaf in pthread_start_thread () from /lib/i686/libpthread.so.0
(gdb) 

첫번째 접속해서 로그인 하면 제대로 이뤄지는데.. 로그아웃하고
두번째 접속해서 로그인 하면 로그인 하는 과정에서
세그먼트 폴트가 뜨네요

메모리 할당 해제 부분인데.. free쓴곳이 없는데...

부탁 드립니다.

core파일 첨부 할랬는데 524k 인데 안올라가네요 -_-;

ssehoony의 이미지

할당한후 free 한 메모리를 사용했을때만 세그먼트폴트가 나오는건 아니지요
원론적으로 할당되지 않은 메모리를 사용했을때 세그먼트폴트가 나오는거니깐
님께서는 사용하는 포인터 값이 가비지 값이던지 아니면 배열같은 것에서
할당한 사이즈를 초과해서 사용한게 아닐까요?

어쨌든 지금 상황은 소스에서 코딩에 실수가 있는 듯 하니
소스가 필요하네요.
어디쯤에서 나는지 확인해서 관련부분 소스를 일부 올려주셔야
대충이라도 짐작해 볼 수 있을 듯 하네요.

stypr의 이미지

login( char *ptr, int user_num) 
{
	int i, len, r=0;
	char *p;
	char id[50],pass[50];
	char query[200];

	MYSQL con;
	MYSQL_RES *result;
	MYSQL_ROW row;

	len = strlen(ptr);

	if( len < 5 )
		return 1000;
	if( strstr(ptr,"|") == NULL )
		return 1000;

	p = strtok(ptr, "|");
	sprintf(id,"%s",p);
	p = strtok(NULL, "|");
	sprintf(pass,"%s",p);

	printf("Login : ID[%s] Password[%s]\n",id,pass);

	printf("Mysql_ 접속 시작\n");

"Mysql 접속시작" 이라는 문구까지 나왔다가 세그먼트 폴트 뜹니다.

Mysql때문에 그런가 해서.. Mysql부분 다 없애고 무조건 참값인
return 1;
돌려주게 했는데도 .. 마찬가지로 세그먼트 폴트

처음 사용자는 모든게 정상적인데... 처음 사용자가 나가고
두번째 사용자가 들어오면 저런 현상이 발생합니다.

datamind의 이미지

Quote:

"Mysql 접속시작" 이라는 문구까지 나왔다가 세그먼트 폴트 뜹니다.

Mysql 접속하는 부분을 잘 보시면 될것 같네요...

stypr의 이미지

접속하는 부분을 아예 다 빼버려도 마찬가지로 에러가 떨어져요...

stypr의 이미지

Mysql 접속 부분 빼고.. strace로 빼낸 결과 입니다

write(1, "Mysql_ \301\242\274\323 \275\303\300\333\n", 17Mysql_ 접속 시작
) = 17
write(1, "\267\316\261\327\300\316 \274\272\260\370\n", 12로그인 성공
) = 12
rt_sigprocmask(SIG_SETMASK, NULL, [RTMIN], 8) = 0
write(6, "\240\260\2@\0\0\0\0\0\0\0\0\330\224\4\10\0\0\0\0\0\0\0"..., 148) = 148
rt_sigprocmask(SIG_SETMASK, NULL, [RTMIN], 8) = 0
rt_sigsuspend([] <unfinished ...>
--- SIGRTMIN (Real-time signal 0) ---
<... rt_sigsuspend resumed> )           = -1 EINTR (Interrupted system call)
sigreturn()                             = ? (mask now [RTMIN])
accept(3, 0xbfffee50, [16])             = ? ERESTARTSYS (To be restarted)
--- SIGSEGV (Segmentation fault) ---
+++ killed by SIGSEGV +++
coolage의 이미지

에러가 발생한 위치가 정확하지 않네요..

올려놓으신 정보에 의하면 "로그인 성공"을 출력한 후 시그널이 발생했군요..

아마도 buffer상의 내용이 화면에 출력되기 전에 에러가 발생했기때문이구요..

로그인 성공 이후의 문장을 확인하셔야 할듯..

추가적으로 printf 등을 이용해 에러발생위치를 찾으려면 매 printf 다음에 fflush를 써줘야 정확하게 알 수 있습니다..

^^;

stypr의 이미지

드뎌 찾았습니다.

pthread_create(&tid, NULL, (void*) &Admin, (void*) user_num);

생성하고 Admin이라는 함수내에서
malloc했다고 세그먼트 떨어진거였네요.

답만 얻었고 원인을 모르니..
원래 저안에서 포인터 가지고 놀면 안되나요?

stoneshim의 이미지

저는 생성된 thread start routine 안에서 malloc 잘 사용하고 있습니다.

pthread_create(&tid, NULL, (void*) &Admin, (void*) user_num);

혹시 여기의 user_num값을 가지고 Admin 함수 내부에서 malloc 호출시에 사용하시나요?

저번에 저지른 어이없는 실수 였는데, pthread_create의 마지막 파라미터를 다음과 같은 방식으로 전달해놓고... 생성 thread의 start routine에서 사용하다가 오동작을 해서 한참 고민한 적이 있었습니다...

for( i=0; i<nThreadCnt; i++ ) {
  ...
  pthread_create(... (void*)&i);
  ...
}

이런 문제는 아닐듯 싶지만 혹시나 해서... 참고하시라고 제 실수를 적어보았습니다. ^^

우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.