else에서 코어 덤프..
#include
#include
#include
#include
#define BUF_SIZE 1024
int main(int argc, char *argv[]){
int fd1, fd2, len;
long size;
char *buf[BUF_SIZE];
if (argc == 1) /*1 ./mycat*/
{
fd1 = 0;
while(size = read(fd1, buf, 1024))
{
write(1, buf, size);
}
}
else
{
if(strcmp(argv[1], ">") == 0) /*2 ./mycat “>” out*/
{
fd1 = open(argv[2], O_CREAT | O_WRONLY, 0666);
while(len = read(0,buf,BUF_SIZE))
{
write(fd1,buf,len);
}
close(fd1);
}
else
{
if(strcmp(argv[2], ">") == 0) /*4 ./mycat mycat.c “>” out*/
{
}
else if(strcmp(argv[2], ">>") == 0) /*5 ./mycat mycat.c “>>” out*/
{
}
else /*3 ./mycat mycat.c*/
{
fd1 = open(argv[1], O_RDONLY);
len = read(fd1, buf, BUF_SIZE);
write(1, buf, len);
close(fd1);
}
}
}
}
cat 만드는 프로그램을 전부 맞쳤는데 모든 if, else if문은 정상으로 전부 작동을 하는데 맨 마지막
else /*3 ./mycat mycat.c*/
{
fd1 = open(argv[1], O_RDONLY);
len = read(fd1, buf, BUF_SIZE);
write(1, buf, len);
close(fd1);
}
여기에서 세그멘테이션 오류 (코어 덤프됨)가 뜹니다.. 구글링 하면서 찾아보고 gdb도 실행해서 찾아봤는데 그냥 메인이라고만 뜨고 찾지를 못하겠네요... 혹시 문제가 될만한 점이 있을까요?
write(fd2, .... )????
write(fd2, .... )???? 또는 O_RDONLY 인데 write 해서요????
else 안에 내용은 제가 따로 만들어서 실행을
else 안에 내용은 제가 따로 만들어서 실행을 시켜봤는데 이상 없이 돌아가는데
else에 접근만 하면은 세그먼트 오류가 떠서 테스트로 그냥 printf만 넣어도 printf문이 실행이 되지 않고
"세그멘테이션 오류 (코어 덤프됨)" 떠버리네요..
우선 </코드> 이렇게 둘러싸서 올려보세요.
우선 < c_o_d_e > < _/c_o_d_e > 이렇게 둘러싸서 올려보세요.
밑줄은 지우시고요.
#include <stdio.h>
fd1 = open(argv[1], O_RDONLY)
fd1 = open(argv[1], O_RDONLY);에서 확실히 argv[1] 파일이 열리나요?
fd1 값을 검사해서 제대로 열리지 않았는지 확인해 보세요.
else /*3 ./mycat mycat.c*/
잘못 됐으면 error문이 떠야하는데 그런거 없이 똑같이 오류만 뜨네요..
#include <stdio.h>
이렇게 else안에 내용만 실행시키면 따로 실행은 잘 됩니다.
디버그 해보시고 어느 라인에서 crash 되는지
디버그 해보시고 어느 라인에서 crash 되는지 확인해 보세요.
IDE를 쓰면 쉬운데 아니면 gdb라도 해보세요.
처음 써보는거라 이게 맞을까요?
처음 써보는거라 이게 맞을까요?
백트레쉬 정보는 이렇게 나오는데 제가 실행을
백트레쉬 정보는 이렇게 나오는데 제가 실행을 잘못시킨거 같기도 하네요..
보통
보통
gdb ./mycat .....
(gdb) b main
(gdb) step
이런식으로는 하는데 구글에 gdb 사용방법 구글링 해보세요.
아니면 eclipse, netbean, clion 같은 것을 깔아서 사용해 보세요. clion 강추합니다. 평가판으로 한달 사용가능합니다.
일단 gdb는 이런식으로 나오네요
일단 gdb는 이런식으로 나오네요
clion은 방금 다운을 받기는 했는데 이것도 사용을 못해봐서 어떻게 사용을 해야할지도 모르겠네요 ㅠㅠ
gdb 에서 아래와 같이 해야 할 겁니다.
gdb 에서 아래와 같이 해야 할 겁니다.
b main
r
step (문제가 생길 때가지 계속 step, 어느 라인에서 오류가 생기는지 알기 위해서임)
clion 사용법은 쉬워요. 아무곳에나 압축풀고 /clion-2022xxxxx/bin/에 들어가신 후 ./clion.sh 치면 될 겁니다. 평가판을 선택하시면 되고요. 새 프로젝트 만들어서 코드 넣고 debug 하시면 되요.
문제 찾았습니다 ㅠㅠㅠㅠㅠㅠㅠㅠㅠ
문제 찾았습니다 ㅠㅠㅠㅠㅠㅠㅠㅠㅠ
./mycat mycat.c 를 넣을경우 argv[2] 값이 널이기 때문에 if(strcmp(argv[2], ">") == 0) 여기 구문에서
argv[2]에 값이 널인 즉 메모리를 할당받지 못한 값을 비교하려했기 때문에 세그먼트 오류가 발생했네요
./mycat mycat.c을 먼저 실행할 방법을 찾던가 아니면 null값일때 값을 할당 또는 추가해야 하는 방법을 찾아봐야 겠네요
if(strcmp(argv[2], ">") == 0)
if(strcmp(argv[2], ">") == 0) /*4 ./mycat mycat.c “>” out*/
여기 구문위에
if(argv[2] == NULL)
argv[2] = "<";
이거를 넣어주는걸로 해결했네요..
문제 찾는데 소중한 시간과 도움 주셔서 정말 감사합니다 ㅠㅠㅠㅠ
예. ㅎㅎ 원래 생각하신 그 위치가 아니었죠?!
예. ㅎㅎ 원래 생각하신 그 위치가 아니었죠?!
디버그 기능을 잘 활용하시면 실력이 쭉쭉 올라갈 겁니다.
댓글 달기