여기분들은...
고수분들이 많지만 저처럼...초보자도 많기 때문에.
제가 프로그램 짜다가 제일 힘든게... 디버그.
컴파일 에러도 안나고.
링크 에러도 안나고.
실행할때 에러가 나는데 대책 없드라구요.
2,3일씩 디버그에만 메달리고....
여러분들도 그런 경험 하지 않나요...?
취직한지 얼마 안되서 그런지 몰라도 전 이게 제일 힘들드라구요.
에러 났을때 제일 잡기 힘든 에러가...
로직 에러하고 메모리 유출
아직까지 경험은 이 2개가 잡기가 제일 힘들드라구요.
로직 에러는 각자가 해결해야할 부분인것 같구요...
메모리 유출부분은 제가 서점에서 이리저리 뒤져서 겨우 찾았습니다.
인포북에서 나온건데.... ?
제가 필요한 것만 눈요기로 보고....
테스트해봤습니다.
실행할때 어느 시점에서 포인터를 잃어버린 경우에는
Edit 메뉴에서 break point 에서...
expression 란에서...
pStatePointer != 0x2334455
이런 식으로 하면...
처음에 할당되는 메모리주소를 적어놨다가 위의 식을 이용하면
포인터를 잃어버린 부분을 찾을수 있습니다.
이 부분은 예를 들면....
함수에 파라미터로 포인터를 넘겨줘야 하는데... 잘못해서 값을 전달하는 경우...
그런 에러는 이 부분으로 찾을수 있을껍니다.
생각해보면 굳이 이걸 이용하지 않아도 무슨 Quick Watch 로 체크 할수 있지만...
근데 어디에서 잃어버린줄 모르면 프로그래미 클때 체크하는게 쉽지 않죠....
그때 이걸 이용하면 유용할꺼라 생각합니다.
2번째는 mfc 메모리에 관한 클레스를 이용하는 방법입니다.
메모리의 할당 상태를 보고 코드상에서 테스트할수 있습니다.
다음과 같이요....
#ifdef _DEBUG
CMemoryState oldm;
CMemoryState newm;
CMemoryState diff;
oldm.Checkpoint();
#endif
....
the code to be tested...
....
#ifdef _DEBUG
newm.Checkpoint();
if( diff.Difference(oldm,newm) )
{
TRACE("메모리 누수nn");
diff.DumpStatistics();
}
#endif
==>메세지.....
0 bytes in 0 Free Blocks.
48 bytes in 1 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 48 bytes.
Total allocations: 48 bytes.
메모리 누수
0 bytes in 0 Free Blocks.
48 bytes in 1 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 48 bytes.
Total allocations: 48 bytes.
메모리 누수
0 bytes in 0 Free Blocks.
48 bytes in 1 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 48 bytes.
Total allocations: 48 bytes.
메모리 누수
0 bytes in 0 Free Blocks.
48 bytes in 1 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 48 bytes.
Total allocations: 48 bytes.
메모리 누수
Total allocation 부분을 이용해서 차이를 체크하는 방법입니다.
두번째...
#ifdef _DEBUG
CMemoryState oldm;
CMemoryState newm;
CMemoryState diff;
oldm.Checkpoint();
#endif
// CString* str = new CString("sssss");
int* i = new int[2];
i[0] = 0x1234;
i[1] = 0x012345678;
#ifdef _DEBUG
newm.Checkpoint();
if( diff.Difference(oldm,newm) )
{
TRACE("메모리 누수nn");
diff.DumpStatistics();
}
#endif
이렇게 하면.....
메세지가 이렇게 뜹니다.
물론 통계부분도 있구요....
아래 부분에서....
0 bytes in 0 Free Blocks.
30 bytes in 3 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 2 bytes.
Total allocations: 30 bytes.
Detected memory leaks!
Dumping objects ->
D:조기영프로젝트ghghghgghghghg.cpp(48) : {57} normal block at 0x00344280, 8 bytes long.
Data: 34 12 00 00 78 56 34 12
==> 이 부분이 integer형 2개를 힙에 할당한 부분인데....
할당되는 메모리는 앞에서부터 밀려가는 식으로 두개씩....
strcore.cpp(118) : {56} normal block at 0x00344228, 18 bytes long.
Data: < ssss> 01 00 00 00 05 00 00 00 05 00 00 00 73 73 73 73
==> 이 부분이 CString이 할당된 부분 같은데....
D:조기영프로젝트ghghghgghghghg.cpp(47) : {55} normal block at 0x00344178, 4 bytes long.
Data: 34 42 34 00
==> 이 부분은... 좀 혜깔리네요....^^
Object dump complete.
The thread 0x46C has exited with code 0 (0x0).
The program "D:조기영프로젝트ghghghgDebugghghghg.exe" has exited with code 0 (0x0).
이 부분 해석해주실수 있는분 부탁합니다....
그리고 total allocation 가지고 하면...차이를 이용해서 체크하면 될것 같습니다.
테스트 될 부분에서 메모리 할당이 되어 있으면 체크할수 있으니까요....
힙공간에서 메모리가 할당된 부분이 있으면....(+)
22 bytes in 2 Normal Blocks.
힙공간에서 메모리가 해제된 부분이 있으면....(-)
-22 bytes in -2 Normal Blocks.
==> 이 부분은 예를 들면
잘못 써서....제 경험상. 만약 Integer클레스를 만들어서 쓴다면...
Integer *r = new Integer[5]; // 원래는 Integer* r = new Integer(5); 이렇게 코딩해야 되는
데......
이부분은 이걸 이용하면 에러를 잡을수 있을거라 생각합니다.
입니다.
또 하나 어느책인가 .... 사이트에서 본적 있는데...
mfc 이용하지 않고...다르게 ....
이용하지 않으니까...잊어먹습니다.
다른 방법 아시는 분은 부탁합니다.
여기에 대한 자세한 정보를 더 아시면 ....설명 부탁합니다.
툴을 다루는데 있어서 취직해서 얻은게...
디버그인것 같습니다....
VC++의 디버그 기능이 좀 맘에 듭니다.
이 사이트 들어와서 글쓰는게 좋습니다.
많은 정보도 접할수 있고....
담에 회사에서 제가 com을 하는데....
제가 도사가 된담...이 부분에 대한 의견을 나누고 싶네요..
지금 제가 경험해서 얻은 지식도 있지만..내놓을 만큼은 아니것 같구요...
제가 많은 지식을 쌓ㅇ았으면 합니다....^^
행복하세요.
고수분들이 많지만 저처럼...초보자도 많기 때문에.
제가 프로그램 짜다가 제일 힘든게... 디버그.
컴파일 에러도 안나고.
링크 에러도 안나고.
실행할때 에러가 나는데 대책 없드라구요.
2,3일씩 디버그에만 메달리고....
여러분들도 그런 경험 하지 않나요...?
취직한지 얼마 안되서 그런지 몰라도 전 이게 제일 힘들드라구요.
에러 났을때 제일 잡기 힘든 에러가...
로직 에러하고 메모리 유출
아직까지 경험은 이 2개가 잡기가 제일 힘들드라구요.
로직 에러는 각자가 해결해야할 부분인것 같구요...
메모리 유출부분은 제가 서점에서 이리저리 뒤져서 겨우 찾았습니다.
인포북에서 나온건데.... ?
제가 필요한 것만 눈요기로 보고....
테스트해봤습니다.
실행할때 어느 시점에서 포인터를 잃어버린 경우에는
Edit 메뉴에서 break point 에서...
expression 란에서...
pStatePointer != 0x2334455
이런 식으로 하면...
처음에 할당되는 메모리주소를 적어놨다가 위의 식을 이용하면
포인터를 잃어버린 부분을 찾을수 있습니다.
이 부분은 예를 들면....
함수에 파라미터로 포인터를 넘겨줘야 하는데... 잘못해서 값을 전달하는 경우...
그런 에러는 이 부분으로 찾을수 있을껍니다.
생각해보면 굳이 이걸 이용하지 않아도 무슨 Quick Watch 로 체크 할수 있지만...
근데 어디에서 잃어버린줄 모르면 프로그래미 클때 체크하는게 쉽지 않죠....
그때 이걸 이용하면 유용할꺼라 생각합니다.
2번째는 mfc 메모리에 관한 클레스를 이용하는 방법입니다.
메모리의 할당 상태를 보고 코드상에서 테스트할수 있습니다.
다음과 같이요....
#ifdef _DEBUG
CMemoryState oldm;
CMemoryState newm;
CMemoryState diff;
oldm.Checkpoint();
#endif
....
the code to be tested...
....
#ifdef _DEBUG
newm.Checkpoint();
if( diff.Difference(oldm,newm) )
{
TRACE("메모리 누수nn");
diff.DumpStatistics();
}
#endif
==>메세지.....
0 bytes in 0 Free Blocks.
48 bytes in 1 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 48 bytes.
Total allocations: 48 bytes.
메모리 누수
0 bytes in 0 Free Blocks.
48 bytes in 1 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 48 bytes.
Total allocations: 48 bytes.
메모리 누수
0 bytes in 0 Free Blocks.
48 bytes in 1 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 48 bytes.
Total allocations: 48 bytes.
메모리 누수
0 bytes in 0 Free Blocks.
48 bytes in 1 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 48 bytes.
Total allocations: 48 bytes.
메모리 누수
Total allocation 부분을 이용해서 차이를 체크하는 방법입니다.
두번째...
#ifdef _DEBUG
CMemoryState oldm;
CMemoryState newm;
CMemoryState diff;
oldm.Checkpoint();
#endif
// CString* str = new CString("sssss");
int* i = new int[2];
i[0] = 0x1234;
i[1] = 0x012345678;
#ifdef _DEBUG
newm.Checkpoint();
if( diff.Difference(oldm,newm) )
{
TRACE("메모리 누수nn");
diff.DumpStatistics();
}
#endif
이렇게 하면.....
메세지가 이렇게 뜹니다.
물론 통계부분도 있구요....
아래 부분에서....
0 bytes in 0 Free Blocks.
30 bytes in 3 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 2 bytes.
Total allocations: 30 bytes.
Detected memory leaks!
Dumping objects ->
D:조기영프로젝트ghghghgghghghg.cpp(48) : {57} normal block at 0x00344280, 8 bytes long.
Data: 34 12 00 00 78 56 34 12
==> 이 부분이 integer형 2개를 힙에 할당한 부분인데....
할당되는 메모리는 앞에서부터 밀려가는 식으로 두개씩....
strcore.cpp(118) : {56} normal block at 0x00344228, 18 bytes long.
Data: < ssss> 01 00 00 00 05 00 00 00 05 00 00 00 73 73 73 73
==> 이 부분이 CString이 할당된 부분 같은데....
D:조기영프로젝트ghghghgghghghg.cpp(47) : {55} normal block at 0x00344178, 4 bytes long.
Data: 34 42 34 00
==> 이 부분은... 좀 혜깔리네요....^^
Object dump complete.
The thread 0x46C has exited with code 0 (0x0).
The program "D:조기영프로젝트ghghghgDebugghghghg.exe" has exited with code 0 (0x0).
이 부분 해석해주실수 있는분 부탁합니다....
그리고 total allocation 가지고 하면...차이를 이용해서 체크하면 될것 같습니다.
테스트 될 부분에서 메모리 할당이 되어 있으면 체크할수 있으니까요....
힙공간에서 메모리가 할당된 부분이 있으면....(+)
22 bytes in 2 Normal Blocks.
힙공간에서 메모리가 해제된 부분이 있으면....(-)
-22 bytes in -2 Normal Blocks.
==> 이 부분은 예를 들면
잘못 써서....제 경험상. 만약 Integer클레스를 만들어서 쓴다면...
Integer *r = new Integer[5]; // 원래는 Integer* r = new Integer(5); 이렇게 코딩해야 되는
데......
이부분은 이걸 이용하면 에러를 잡을수 있을거라 생각합니다.
입니다.
또 하나 어느책인가 .... 사이트에서 본적 있는데...
mfc 이용하지 않고...다르게 ....
이용하지 않으니까...잊어먹습니다.
다른 방법 아시는 분은 부탁합니다.
여기에 대한 자세한 정보를 더 아시면 ....설명 부탁합니다.
툴을 다루는데 있어서 취직해서 얻은게...
디버그인것 같습니다....
VC++의 디버그 기능이 좀 맘에 듭니다.
이 사이트 들어와서 글쓰는게 좋습니다.
많은 정보도 접할수 있고....
담에 회사에서 제가 com을 하는데....
제가 도사가 된담...이 부분에 대한 의견을 나누고 싶네요..
지금 제가 경험해서 얻은 지식도 있지만..내놓을 만큼은 아니것 같구요...
제가 많은 지식을 쌓ㅇ았으면 합니다....^^
행복하세요.