메모리 할당시에 세그먼트 폴트 ㅠ.ㅠ
글쓴이: 익명 사용자 / 작성시간: 수, 2002/01/30 - 3:13오후
malloc()이나 strdup()같은..
메모리 할당을 하여 처리하는 함수에서 세그먼트 폴트가 됩니다.
즉 malloc()이나 strdup()가 실패해서가 아니라..
메모리 할당하면서 세그먼트 폴트가 나네요..
2일 이상 끙끙알아 같고 알아낸 원인이 이겁니다 ㅠ.ㅠ
그런데 왜 이런 증상이 나는지 모르겠네여./.
코어라도 나면 잡겠는데.. 코어도 안남고...
그렇다고 메모리 부족으로 생기는것두 아니구여..
이런 증상이 나는 원인이나 해결책을 아시는분은 답변좀 해주시기 바랍니
다.
저 미치기 지금 일보직전이예염 ㅠ.ㅠ
Forums:
소스를 올려보시기 바랍니다.(내용없음)
....
Re^2: 소스를 올려보시기 바랍니다.(내용없음)
fprintf(stderr,"Check #3\r\n");
get_userinfo_by_request(request, &userdata);
fprintf(stderr,"Check #4\r\n");
con->userid = strdup(userdata.userid);
fprintf(stderr, "%s - %p\r\n", con->userid, con->userid);
con->name = (char *)malloc(20+1);
memset(con->name, '\0', 20+1);
sprintf(con->name, "%s", userdata.name);
// con->name = strdup(userdata.name);
fprintf(stderr, "%s - %p - %s\r\n", con->name, con->name,
userdata.regio
n);
// con->region = (char *)malloc(8+1); <== 바꿔서 하면 여기서 죽
구요
// memset(con->region, '\0', 8+1);
// sprintf(con->region, "%s", userdata.region);
con->region = strdup(userdata.region); <== 지금은 여기서 죽습
니다.
참고로 처음 접속후 커맨드 실행시에는 정상적이나...
두명이 접속후 processing을 좀 한후..
두개다 종료하고 다시 접속할시에 여기서 퍽 죽어버리네여 ㅠ.ㅠ
아 괴롭다 정말 ㅠ.ㅠ
Re: 메모리 할당시에 세그먼트 폴트 ㅠ.ㅠ
그럴경우 거의 100% 쏘쓰 코드 어딘가에, 메모리 할당을 잘못한 부분이
있기 때문에 생깁니다.
이는 메모리할당을 하는 해당 변수뿐만 아니라, 전혀 관계가 없어 보이는
다른 부분에서의 메모리 할당때문에, 에러가 발생할수도 있습니다.
분명히 해당 변수에 대해서 메모리 할당을 제대로 한것같은데도
에러가 발생한다면, 쏘쓰 어딘가에서 메모리를 잘못사용한곳이 있을겁니다.
루프를 돌린다면 특히 조심해야하죠..
쏘쓰코드 천천히 살펴보시고, gdb 같은 디버깅도구를 사용하셔서 에러를
잡으심이 좋을듯 싶습니다.
Re^2: 메모리 할당시에 세그먼트 폴트 ㅠ.ㅠ
저도 처음에는 그렇게 생각했는데여..
그렇다면 처음 접속자와 두번째 접속자가 사용할땐 괜찬다가..
이 두 접속자가 종료후에 다시 접속시에 이런 문제점이 발생하냐는거지
요..
또 한명만 접속했다가 돌아가는건 또 괜찬더군요 ㅠ.ㅠ
정말 미치겠습니다...
Re^3: 소스를 올려보시기 바랍니다.(내용없음)
c++에서는 끝문자를 "\0"를 사용합니까?
그냥 "0"안씁니까?
sprintf대신에 snprintf를 쓰심이 좋을듯.
잘모르지만...
DB쪽에 문제가 있는 것 같군요...
우선 userdata를 정의하는 구조체를 훑어본 다음에 .name 과 .region 이
포인터인지 어레이인지 ... ('어레이'라면 혹 덮어쓰기 했을 수도 있고,
이런 경우는 거의 없을테지만 NULL 로 할당 될 수도 있습니다...)
그리고 가장 중요한건 .name ,.region 이 '\0'로 끝나는지 확인 하시면
될 겁니다... (이건 format string '%s'가 '\0'을 원하기 때문이죠.
C 에서 자주 발생하는 버그죠...)
그런데 제생각에는 DB쪽에 문제가 있는 것 같군요...
댓글 달기