[질문]gdb 에서 print 값에 대해
세그멘테이션 폴트가 나길래 gdb를 써봤거든요. 근데 변수값이 제가 생각하던거와는 다른 값이 나와서 하루 종일 머리 쥐어 뜯고 있습니다. 다행히 어떻게 어떻게 해서 생각대로 되긴 했는데 gdb 사용하면서 궁금한점이 생겨서 이렇게 질문 올립니다.
struct buf{
char filename[20];
off_t size;
}
int main(int argc,char* argv[]){
----생략---
creat(argc, argv);
----생략----
}
int creat(int argc,char** argv){
---생략-----
struct buf head[argc];
struct stat statbuf;
for(i=2;i< argc; i++){
fd[i]=open(argv[i], O_RDWR);
strncpy(head[i].filename, argv[i],20);
fstat(fd[i], &statbuf);
---생략
}
comand line 상에서 main의 인자로 받아들인 파일들을 open 해서 나중에 그 file descriptor들을 사용하고, 또 파일의 이름과 size등을 저장하기 위해 struct head를 사용했거든요. 코딩하다가 보니까 자꾸 seg fault가 나서 gdb를 사용했는데 아래와 같거든요.
(gdb) run arg1 arg2 arg3
fd[i]=open(argv[i],O_RDWR);
--->(gdb)print fd[i]
------------------------> fd[2]=oxbfffed73
//저는 5,6,7 같은 fd의 값을 예상했거든요..
strncpy(head[i],filename, argv[i],20);
----> (gdb)print head[i].filename
------------>"\001...\001\001"
//comand line 상의 argument가 strncpy 됐을거라 생각했는데 gdb에서
//볼때는 그렇게 안 나오네요..어찌 된건지..
//(gdb)print argv[i]하면 예상대로 파일이름이 나오던데..
fstat(fd[i], &statbuf);
-->(gdb)step
-->__fstat(fd=6,buf=0xbffff9d8) at fstat.c
-->fstat.c: No such file or directory in fstat.c
//여기선 fd=6 이라고 예상된 값이 나오고 위에선 아니구..?????
// gdb에서 step하다 보면 자꾸 "No such file "이란 말이 나오는데
//저거 무슨 말인지..파일이 없다는 얘긴가요..
오늘 하루 종일 머리 쥐어 뜯고 있었습니다. 분명 제가 모르는 뭔가가 있는거 같은데..도와 주세요.
참..그리고 코딩하면서 질문 있거든요. 전 이제 막 책을 보면서 코딩해보고 그러는데 정말 막히는 곳이 많더라구요. 책을 뒤져 가며 머리 쥐어 뜯으며 시작하고 있는데 아무래도 혼자서 하기엔 물음표도 안 없어지구..그러네요. 마치 처음 당구 치기 시작했을 때 80 치는 친구들끼리만 계속 치면 시간이 아무리 지나도 그다지 실력이 안 느는 것같은....다행히 이곳에 질문 올리고 답변을 얻으면 정말 그게 작은 실마리가 되어주기라도 하니 너무 감사하기두 하구요.. 그래서 질문의 요지는 혼자 공부하는 사람은 그런 물음표들을 어떻게 해결해야 하는지..[/b]
정확하게 소스가 올라오지 않아 정확하게 말해드릴수 는 없는데요 [co
정확하게 소스가 올라오지 않아 정확하게 말해드릴수 는 없는데요
이부분에서 i가 2부터 시작하는데 argv는 인자로 1부터 읽어 오려는것 같네요..
이런식이 아닐까요...
fd배열의 의 범위를 어디까지 주었을지 모르겠지만
배열의 범위를 넘어가서 생기는 에러습니다.
한번확인해보세요..
컴파일시 옵티마이즈 옵션을 주지 마세요.
컴파일시 옵티마이즈 옵션을 주지 마세요.
screen + vim + ctags 좋아요~
Re: [질문]gdb 에서 print 값에 대해
fd배열의 선언이 어떤 상태인지 궁금하네요.
print *fd[i]로 출력을 한번 해보시죠.
문자열 복사가 제대로 안된거 같네요
gdb에서 출력할수 없는 문자열은 "\001.." 이런식으로
인코딩 해서 보여줍니다.
strncpy(head[i],filename, argv[i],20);
head[i],filename 여기에 ,는 오타이지요?
print 에 찍어보실 때는 head[i].filename로 하신것 같은데.
확인해보세요
님께서 step in 한 것은 library 함수입니다.
그래서 fstat.c를 찾는 것이구요.
라이브러리 srpm을 받아서 설치하시면 해결되는 문제 입니다.
울랄라~ 호기심 천국~!!
http://www.ezdoum.com
댓글 달기