파라미터 패싱이 이상.. 귀신이 곡할 노릇..ㅜㅜ
글쓴이: emanwon / 작성시간: 월, 2005/10/24 - 5:48오전
caller(...)
{
Info* a;
.
.
free_relation(a); // a = 0x8109e38
}
free_relation(Info* a) a = 0xffffffff ??
{
.
.
.
}
위와 같이 함수를 호출하면 파라미터 값이 바뀝니다.
GDB로 찍어보면 caller()에서 a는 분명히 8109e38
이라는 주소를 넘기는 것으로 나옵니다.
근데 callee측(free_relation)에서 파라미터값을 찍어보면
a가 ffffffff로 바뀌어 segmentation fault 가 납니다..ㅜㅜ
이런 현상 겪어 보신분 계신가요??
참고로 소스코드는 약 2메가 정도 됩니다.
확실한것은 side effect같은건 전혀 없습니다.
마감일자 얼마 안남았는데 클났네요.ㅜㅜ
도와주세요~~
Forums:
이상하군요.제가 테스트해보니 메모리할당여부와 상관없이caller,
이상하군요.
제가 테스트해보니 메모리할당여부와 상관없이
caller, free_relation에서 같은 주소가 찍히는게 맞는 것 같은데요.
side effect가 없다고 하셨는데
아직 발견 못하신게 아닌가 싶네요 ^^;;
간단한 테스트코드를 만들어서 해보세요.
아니면 새프로젝트를 생성해서 기존의 것으로부터
부분적으로 옮겨서 테스트해보세요.
2005년 10월 24일.
경험상 그런 증상이 있을 때 의심해 볼 수 있는 것은:첫째. th
경험상 그런 증상이 있을 때 의심해 볼 수 있는 것은:
첫째. thread 또는 shared memory를 썼을 때, critical section인 곳에 lock/unlock을 하지 않았을 경우,
둘째, 완전하지 않은 rule을 가진 Makefile로 작업시 clean하지 않고, build했을 경우,
정도네요.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
뭔가 Side Effect(?)가 없을리가 없다고 봅니다.함수를 호출
뭔가 Side Effect(?)가 없을리가 없다고 봅니다.
함수를 호출하고 돌아온 후에도 a값이 0xffffff..인지요? (중간에 fault를 넘기던지 해서 테스트를...)
그렇다면, Info* a의 주소에(포인터의 값 말고 포인터의 주소) GDB로 Watchpoint를 걸어서 어느 코드에서 a의 값이 바뀌는지 확인해보시는게 어떨까요?
디버깅용 바이너리는 옵티마이즈 옵션을 끄고 하세요
디버깅용 바이너리는 옵티마이즈 옵션을 끄고 하세요
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
시스템 환경이 어떻게 되나요 ?
시스템 환경이 궁금합니다.
CPU 또는
컴파일러의 사양좀 알려주시면 도움이 될것 같습니다.
컴파일러 마다 파라미터 패싱하는 방법이 다를 수 있는것 같습니다.
알고 있는 것으로는
범용 레지스터를 사용하여 패싱하는 방법
스택을 사용하여 패싱하는 방법
그리고, 아규먼트리스트를 사용하여 패싱하는 방법
Re: 시스템 환경이 어떻게 되나요 ?
시스템 환경이 어떠하든간에 저런 상황이 된다는것 자체가
말이 안되는걸로 보입니다.
파라미터 패싱방법, 컴파일러 종류, 시스템 환경과
무관하게 저 경우는 올바른 값이 전달되어야 합니다.
분명히 찾지 못한 side effect가 있을것으로 생각됩니다.
윗분들 말씀대로 말이 안되죠.하지마 소스레벨 디버거가 실수는 종종
윗분들 말씀대로 말이 안되죠.
하지마 소스레벨 디버거가 실수는 종종 하죠.
어셈블리어로 확인해보심이~
int free_relation(Info* a); // prototype
int free_relation(Info* a); // prototype definition ??
prototype definition은 참조한(caller) 프로그램 헤더에서 해주고 있겠지요?
많은 답변 감사합니다.
아무래도 어디선가 side effect가 있나 보네요..
시스템을 알면 도움이 되지 않을까요?
올바른 환경이 구축(구현)되어 있다는 가정하여,
side effect(원치 않는 행위)을 찾을 수 있을것으로 봅니다.
stack overflow도 고려대상이 될 듯 싶습니다.
stack overflow도 고려대상이 될 듯 싶습니다.
위는 거대 로컬변수의 선언 등이 예측되는 것이고,플랫폼, 사용라이브러
위는 거대 로컬변수의 선언 등이 예측되는 것이고,
플랫폼, 사용라이브러리등에 대해서도 간략하나마, 언급이 있으셔야 겠군요.
댓글 달기