디버그모드에서는 나타나지 않는 버그?
글쓴이: ixevexi / 작성시간: 월, 2006/11/13 - 12:40오후
win32 api를 공부하는 중에
조그만 프로그램 하나를 만들었습니다
디버그 모드에서 잘 돌아가는걸 보고 흡족해서 친구들에게 나눠줘보려고
릴리즈모드에서 컴파일했는데.. 왠걸..
버그가 나는게 아니겠습니까?
이런 경우는 무엇을 의심해야합니까?
PS 코드도 딸랑 한줄 안올리고 이런 질문 드리는게 상당히 거시기-_-하지만
코드가 심히 지저분하고 그냥 일반론적인 관점에서 어떤 차이가 있기에
문제가 생기는지 궁금해서 올립니다
PS2 이런경우 디버그는 소프트아이스같은걸로 하드-_- 디버깅에 들어가야합니까?
Forums:
이런 경우 대부분의 경우에는
변수 초기화로 인한 문제.. --;
http://www.kwak101.pe.kr/bbs/view.php?id=kwak_worksInternDocTip&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=10
참고하세용~
그립다는 것은 아직도 네가 내 안에 남아 있다는 뜻이다.
그립다는 것은 지금은 너를 볼 수 없다는 뜻이다.
볼 수는 없지만 보이지 않는 내 안 어느 곳에 네가 남아 있다는 뜻이다.
-이정하의 《혼자 사랑한다는 것은》중에서-
그립다는 것은 아직도 네가 내 안에 남아 있다는 뜻이다.
그립다는 것은 지금은 너를 볼 수 없다는 뜻이다.
볼 수는 없지만 보이지 않는 내 안 어느 곳에 네가 남아 있다는 뜻이다.
-이정하의 《혼자 사랑한다는 것은》중에서-
Release Build에서는
Release Build에서는 코드 최적화가 다 되어 있고 쓸모없는 디버깅 정보들이 빠지면서 데이터 조작에 실수가 있었던 부분에서 버그 증상이 나타나는 경우가 많습니다. (반대로 얘기하자면 Debug Build에서는 디버깅 정보나 최적화가 안된 코드들 때문에 버그가 발견되지 않을 가능성도 있다는 뜻입니다.) 결국 프로그래머가 만든 버그임에는 틀림없지만 찾기란 쉬운 일은 아닙니다. 결국 알고리즘부터 차근차근 살펴보시는 것이 좋을 듯 합니다. 지역 변수 초기화, 메모리 바운더리 조작 실수 등등.. 체크할 부분은 많습니다.
흑흑..
이거 정말 피똥싸는일이 되겠는데요
원래 사람의 머리가 간사해서
맞다고 생각한 부분은 코드리뷰를 할때도 무심코 그냥 지나치게 되서
논리적 에러찾기가 눈으로 봐서는 정말 어려운데 ㅠ.ㅠ
이럴때 정말 pair programing해주는 짝패가 있었으면 좋겠네요..
그리고 eternalbleu님 글 잘 읽었습니다 그런 차이가 있네요
다시 코드리뷰해본결과 변수 초기화 문제는 아닌거 같습니다.
우선 제가 만든 프로그램을 첨부하겠습니다
제 프로그램은 아주 간단한 수도쿠 풀이기입니다. 문제를 주면
답을 맞추어 주죠. 단 답이 여러개 있을 수 있는 경우는 첫번째로 찾은 답만 보여주는
간단한 프로그램입니다. 자식윈도우랑 메뉴공부할겸 해서 만들어 봤었습니다.
버그는 calculate! -> clear -> calculate -> clear 이렇게까지는 작동이 되나
다시 한번 caculate하면 첫번쨰 줄이 맛이 갑니다 -_-;; 즉 처음부터 버그가 있는게 아니라
반복 동작속에 문제가 있어서 참 이거 힘드네요..
*버그를 잡아서 완성된 버전을 올려놓습니다.^^
----------------------
C++, 그리고 C++....
죽어도 C++
C++, 그리고 C++....
죽어도 C++
1. purify or boundcheck를
1. purify or boundcheck를 구해서 버그가 나는 상황까지 재현해 보세요.
아마 경고 메시지가 나타날 가능성이 큽니다.
2. 코드량이 많다면, compiler optimizer의 오류일 가능성도 큽니다.
저는 이런 경우를 너무 많이 당해서..컴파일러를 사실 잘 믿지 않습니다..
건승하시길.
고도의 추상화, 극도의 구체화, 에디슨을 그리워하다.
고도의 추상화, 극도의 구체화, 에디슨을 그리워하다.
race condition
이 녀석도 debug mode 에서 찾기 어렵더군요.
답변 모두 감사드립니다.
다만 제 프로그램이 간단해서
malloc등 메모리 할당을 쓰지 않습니다
모두 static, 전역변수를 이용합니다.
두번째로 당연히 싱글쓰레드입니다.
자원을 다른 프로세스와 공유할일도 없기에
레이스 컨디션은 아닐꺼 같네요
C++, 그리고 C++....
죽어도 C++
C++, 그리고 C++....
죽어도 C++
제가 보기에는 어떤
제가 보기에는 어떤 변수가 자기 boundary를 넘고 있는 것으로 보입니다. 3회 이후부터는 아예 계산이 되지 않는군요. 혹시 포인터 변수를 사용하고 있다거나 배열의 index 변수를 사용하고 있다면 clear 할 때 그 변수가 제대로 초기화 되는지 확인해 주시기 바랍니다.
올려주신 바이너리를
올려주신 바이너리를 실행하면서 전역변수 영역을 체크해보니 1 부터 차례대로 숫자를 저장해 둔 배열(또는 포인터 참조로 짐작되는) 변수의 영역이 계속 메모리 뒷부분으로 이동하고 있었습니다. 즉, boundary를 넘어서 index가 계속 증가하고 있다는 얘기입니다. 해당 변수의 index를 초기화 해 주시기 바랍니다.
막 고쳤는데
글이 올라와 있네요
어떻게 전역변수가 커지고 있따는걸 확인하셨습니까? 신기합니다..
C++, 그리고 C++....
죽어도 C++
C++, 그리고 C++....
죽어도 C++
흑흑 해결했습니다 ㅠ.ㅜ
문제는 boundary check불량이었습니다.
애초에 백트래킹을 위해 조그마한 스택을 만들었습니다.
스택자체가 가볍게 쓸거라서 내부적으로 전역변수로 어레이를 만들고
인덱스하나 두어서 스택을 쓰는데
계산직전에 인덱스를 0으로 되돌리지 않는 실수-_-를 하는 바람에
그 스택이 오버플로가나서 프로그램이 깨지는 것이었습니다.
3번만에 꺠지는걸 보니 내부적으로 꽤 크게 잡혔나봅니다 -0-;;
결론적으로 boundary check + 초기화 문제였네요
변수 초기화 부분을 모두 잘 해줬다고 생각했었는데
실제 계산직전에 전에 쓰던 변수들을 초기화해야했었는데 프로그램 로딩시 초기화만
생각하는 우를 저질렀습니다...
잘 됩니다 ^0^ 답변 주신분들 모두 감사드립니다. 복받으실꺼에요...
C++, 그리고 C++....
죽어도 C++
C++, 그리고 C++....
죽어도 C++
댓글 달기