Pthread로 도는 서버에서 mysql_real_connect 에러......
글쓴이: stypr / 작성시간: 화, 2004/11/09 - 10:32오전
#0 0xdfa79afe in t_splay () #1 0xdfa79a04 in t_delete () #2 0xdfa79777 in realfree () #3 0xdfa79cea in cleanfree () #4 0xdfa792fe in _malloc_unlocked () #5 0xdfa7921d in malloc () #6 0xdfadd7d6 in my_malloc () #7 0xdfadc8fa in vio_new () #8 0xdfad96e5 in mysql_real_connect () . . .
if(!mysql_real_connect(&mysql, host, id, pass, db ,3306, (char *)NULL, 0)) { sprintf(log_me,"Email || %s | %s",domain,mysql_error(&mysql)); make_log(log_me,0); return 0; }
서버(쓰레드로 구성)로 동작하는 프로그램인데...
가끔 저러네요.. 커넥트 부분에서.... 저러면서 세그먼트폴트 뿌리고 쭉 뻗음
하루에 한번씩 저러는데.. ㅇ ㅔ ㅎ ㅕ 기진 맥진...
혹시 저런 경험 하신분 답변 부탁 드립니다.
행복하세욥.
Forums:
저도 비슷한 현상...
저도 간단히 짠 쓰레드 프로그램에서 mysql_real_connect() 함수를 이용할 때 간혹 발생했습니다.
위치는 상황에 따라 달라집니다.
# gdb 실행결과 예
...생략...
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1271411792 (LWP 1754)]
Character set 'latin1' is not a compiled character set and is not specified in the
'/usr/local/mysql/share/mysql/charsets/Index.xml' file
[*WARNING*] not connect to mysql server : ERROR= Can't initialize character set latin1
(path: /usr/local/mysql/share/mysql/charsets/)
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1271579728 (LWP 9225)]
0x00a39b4d in add_collation () from /usr/lib/mysql/libmysqlclient.so.16
(gdb) Quit
(gdb) bt
#0 0x00a39b4d in add_collation () from /usr/lib/mysql/libmysqlclient.so.16
#1 0x00a43807 in cs_leave () from /usr/lib/mysql/libmysqlclient.so.16
#2 0x00a4a5f5 in my_xml_leave () from /usr/lib/mysql/libmysqlclient.so.16
#3 0x00a4ac82 in my_xml_parse () from /usr/lib/mysql/libmysqlclient.so.16
#4 0x00a43cbf in my_parse_charset_xml () from /usr/lib/mysql/libmysqlclient.so.16
#5 0x00a39c6b in my_read_charset_file () from /usr/lib/mysql/libmysqlclient.so.16
#6 0x00a3a6ae in get_charset_by_csname () from /usr/lib/mysql/libmysqlclient.so.16
#7 0x00a4c99b in mysql_init_character_set () from /usr/lib/mysql/libmysqlclient.so.16
#8 0x00a4d9cd in mysql_real_connect () from /usr/lib/mysql/libmysqlclient.so.16
아래 링크 참조하면, 오류와 진행상황을 볼 수 있습니다.
http://bugs.mysql.com/bug.php?id=37653
빨리 해결되길 기원하며...
libmysqlclient_r을 링크해보세요.
멀티스레드 환경이라면 thread safe한 mysql 라이브러리를 쓰셔야 합니다.
혹시 하나의 스레드에서 작동하더라도 가급적이면 libmysqlclient_r을 사용하시는게 좋습니다.
제가 짠 서비스 프로세스도 저런 문제를 가지고 있다가 thread safe한 라이브러리를 사용한 이후
현재 4개월째 중단없이 잘 운영되고 있습니다.
윗글 및 관련 사이트 참조하고 난 후, 또 다른 문제 야기
윗 글에서 언급한 것처럼, 멀티 쓰레드 환경에서는 다른 라이브러리를 링크해야 하는군요.
관련 정보가 아래 링크에 나와 있습니다. 참고하시길...
http://dev.mysql.com/doc/refman/5.1/en/threaded-clients.html
그런데, 저는 문제가 하나 더 생겼는데요.
멀티스레드로 libmysqlclient_r을 링크하고 난 후부터 초기 접속이 안되는 문제가 발생하는데..
원래 코드에서 더 변경되어야 할 것이 있는건가요?
ERROR(2003)= Can't connect to MySQL server on 'localhost' (111)
libmysqlclient 라이브러리를 사용한 경우에는 한번에 접속됐는데,
libmysqlclient_r 라이브러리를 사용하면 첫 번째 접속 시도에서는 위 에러가 발생하고, 두 번째부터 접속이 되는 경우가 발생합니다.
댓글 달기