[원문] http://northwind.springnote.com/pages/69967 northwind 님의 노트중에서 발췌

Compiler options for finding Bugs #1

더보기

 

 

 

Compiler options for a debug build #1

더보기

 

 

 Compiler options for a release build #1

더보기

 

디버그 런타임 라이브러리 사용시 특징 #1

더보기

 

릴리즈 모드에서 디버깅 하기 #1'

 

 설정을 변경하면 디버깅은 잘되나 배포판을 만들 경우에는 변경된 옵션을 환원하고 빌드하자.

자주 써야 할 경우 빌드 타입을 하나 더 만들어서 사용하는 것도 한가지 방법이다.

 

 

vs 6.0 기준

더보기

vs .net 기준

더보기

 

Registers And Pseudo-registers #1

 Register값은 “Registers" 윈도우에서 확인이 가능하지만 단순하고 값만을 알수 있다. 이 값들을 ”Address(Watch)" 박스에서도 확인이 가능하며 여러 부가 기능과 같이 쓸수 있다.

 예를 들어 EAX의 값을 확인 해볼려고 하면 Watch 항목에 “@EAX"혹은 ”@eax"와 같이 대소문자를 구분하지 않고 넣으면 이 래지스터의 값을 확인 할 수 있다.

 또한 Pseudo-register"의 값또한 확인 할수 있는데. "@ERR"의 Pseudo-register 값은 매우 유용하게 사용할 수 있는데 이 값이GetLastError의 값을 나타내기 때문이다. 만약 “@ERR,hr"이라고 입력한다면 Win32의 에러코드에 해당하는 택스트를 보여 줄것이다.

 

 

더보기

 

 

 

Pseudo-registers that the Watch window supports #1

더보기

 

Watch Window Formatting Symbols #1

 Watch 윈도우는 변수의 값을 볼수 있게 해주는데, 값을 십진수나 16진수로서 확인할 수 있다. 16진수는 팝업 메뉴에서 “Hexadecimal Display"를 선택하면 볼수 있다. 이 이외에도 여러 가지 옵션을 주어서 사용할 수 있는데 이들은 Watch Window에 등록되는 변수명 뒤에 ","를 삽입하고 그뒤에 옵션을 주어 사용할 수 있다.

 

더보기

 

 

 

 

디버깅에 도움이 되는 메모리 마킹 패턴 #1'

 

 

더보기

 

가끔 오류가 발생했을 경우에  만날수 있는 magic number. ( 디버깅 모드에서만 byte pattern 으로 마킹됨. )

 

non-MFC 프로젝트에서 메모리 릭(Memory Leck) 검출

 mfc 프로젝트에서는 DEBUG_NEW 가 기본적으로 제공되므로 메모리 릭을 검출하기가 용의하다. 하지만 일반 프로젝트에서는 추가적인 설정이 필요하다.

더보기

 위와 같은 코드를 기초 인클루드 파일에 추가하면 된다. ( 예를 들어 StdAfx.h 와 같은 곳에.. )

그리고 아랫 내용을 cpp 파일의 상단(인클루드 아랫 부분)에 추가하면 된다.

더보기

그리고

더보기

위와 같이 App 최초 구동시 메모리 릭 검출 디버깅 옵션을 켜준다.

 

그러면 디버그 모드로 실행 했을 경우 App 종료시 output 창에 메모리 릭 발생시 메모리 릭 정보가  해당 소스 파일과 라인등 정보와 함께 출력되는 것을 볼수 있을 것이다.

 

실수 연산 오류 발생시 Exception 발생 시키기 #2

    int stat = _controlfp(0, 0);
   stat &= ~(EM_ZERODIVIDE);
   _controlfp(stat, MCW_EM);

와 같이  EM_ZERODIVIDE 옵션을 추가하였다면 0으로 나눌 경우 해당 코드 부분에서 exception이 발생하므로 발생 부분을 즉시 확인할 수 있는 효과가 있다. 기타 다른 옵션은 MSDN 에서 _controlfp를 찾아서 확인하자.

 

Special Floating-Point Values and Their Representations #3

더보기

*, 1.#QNAN 의 경우 1.#INF ( 무한대의 값 ) 으로 연산시에 발생함.

 

 Pure virtual Function Call #4

순수 가상 함수를 파괴자 등에서 호출하여 생기는 오류 검출 방법.

더보기

 References

더보기

switch ~ case 문안에 변수를 초기화 하려고 하면 초기화가 생략 되었다는 메시지가 발생하게 된다.

switch(nNum)
{
case 1:
int i;
break;
}

이럴때는 case 안에 중괄호를 쳐주면 가능하다..


switch(nNum)
{
case 1:
{
int i;
}
break;

}

// 읽기용데이터작성

CString CPLC_Comm::MakeReadCmd(int nCpu, CString strAddress, int nSize)
{
    CString strCmd;

   // 01BRDI00001,020 CR LF //    01WRDD00001,05 CR LF     strCmd= "HHCMDSAAAAA,LLL";

    switch(strAddress.GetAt(0))
    {
        // Word Read    
        case 'X':
        case 'Y':            
        case 'I':            
        case 'E':            
        case 'L':            
        case 'M':        
        // 여기까지는Bit / Word Read 모두가능

        /*        
        // Bit Read                                                                
        strCmd.Format(_T("%.2dBRD%s,%.3d\r\n"),
                      nCpu,
                      strAddress,
                      nSize);
        */

        // 이하는Word만읽기가능...    
        case 'T':    // TP = Timer Current Value, TS = Timer preset value, TI = Timer current value(Count Up Type)
        case 'C':    // CP = Timer Current Value, CS = Timer preset value, CI = Timer current value(Count Up Type)
        case 'D':
        case 'B':
        case 'W':
        case 'Z':
        case 'R':
        case 'V':
            // Word Read
            strCmd.Format(_T("%.2dWRD%s,%.2d\r\n"),
                          nCpu,
                          strAddress,
                          nSize);        
            break;
    }
    return strCmd;
}

// 쓰기용데이터작성
CString CPLC_Comm::MakeWriteCmd(int nCpu, CString strAddress, CString strData)
{

// 01BRWI00001,020 CR LF //    01WRWD00001,05 CR LF    strCmd= "HHCMDSAAAAA,LLL,";
    CString strCmd;

    switch(strAddress.GetAt(0))
    {            
        // Bit Write    
        // X, M, Z 는쓰기불가..
        // 아래것은BitWord 모두가능하니까.. 구분해서처리하도록하자...
        case 'I':
        case 'Y':        
        case 'E':
        case 'L':
            // 여기까지는Bit/Word 모두사용가능

            if( strData.GetLength() < 5)                                // 길이가1이면1Bit만쓰자...
            {
                // 한비트씩쓰니까.. 길이는고정...
                strCmd.Format(_T("%.2dBWR%s,001,%s\r\n"),
                              nCpu,
                              strAddress,
                            // (strData.GetLength()),                            // 기존처럼.. 굳이.. 길이구할필요가없음..
                              strData);
            }
            else                                                                // 아니라면Word 형태로쓰자..
            {
                if(strData.GetLength() % 4 == 0)
                {
                    strCmd.Format(_T("%.2dWWR%s,%.2d,%s\r\n"),
                                  nCpu,
                                  strAddress,
                                  (int)(strData.GetLength() * 0.25),
                                  strData);
                }
                else
                {
                    _LOG_DISP(_T("Word 번지의값은4자리값만사용할수있습니다."));
                }
            }
            break;            

        // 여기부터는Word만가능
        case 'T':    // TP = Timer Current Value, TS = Timer preset value, TI = Timer current value(Count Up Type)
        case 'C':    // CP = Timer Current Value, CS = Timer preset value, CI = Timer current value(Count Up Type)     
        case 'D':    
        case 'B':
        case 'R':    
        case 'W':
        case 'V':    
        // Word Write
            if(strData.GetLength() % 4 == 0)
            {
                strCmd.Format(_T("%.2dWWR%s,%.2d,%s\r\n"),
                              nCpu,
                              strAddress,
                              (int)(strData.GetLength() * 0.25),
                              strData);
            }
            else
            {
                _LOG_DISP(_T("Word 번지의값은4자리값만사용할수있습니다."));
            }            
            break;

            // 특수명령어처리...
        case 'S':        
            switch(strAddress.GetAt(2))        
            {    
                case 'P':                                
                    strCmd.Format(_T("%.2dSTP\r\n"), nCpu);                    // Stop
                    break;                    

                case 'A':
                    strCmd.Format(_T("%.2dSTA\r\n"), nCpu);                    // Run
                    break;
            }
            break;
    }

    #ifdef _DEBUG
        //TRACE(strCmd);
        _LOG_DISP(strCmd);        
    #endif //_DEBUG    
    _LOG_DISP(strCmd);        
    return strCmd;
}

="X0"&REPT("0",3-LEN(DEC2HEX(ROW(A1)))) & DEC2HEX(ROW(A1))

 

참고용임…


정발위에도 모드칩 없이도 홈브류가 가능하다...

아래 블로그를 보고 내 WII에도 가능할 듯 싶어서 해 보았다.. 결과는 OK
(이전에도 나왔으나.. 그때 했을때는 실패ㅠㅠ .......
 정발은 안 되는가 싶었따... ㅠㅠ
까먹고 있다가 심심해서 검색해 본 결과 된다고 해서... 다시 시도~~)

HomeBrew가 모드칩 없이도 가능하다는것이다.. 물론 맨 아래쪽에 있는 IOS를 변경해야만 했다.
몇가지를 해 본 결과 가능했다.. 후후...
이제 위에서도 프로그래밍을 해볼수가 있겠군....


[관련 블로그]

정발위에도 홈브류 세계의 문이 열리게 된거 같습니다.  http://britzw.tistory.com/128

P.S

더보기


 


 

자주 사용하는 프로그램 설치 결과..

프로그램 설치 및 실행 결과 (프로그램 명 / 설치 / 사용 / 비고)

더보기





#include "stdafx.h"

#include "windows.h"    

#include "Mmsystem.h"


void timeBeginPeriodTest()

{

    DWORD    dwStartTime = 0;

    DWORD    dwEndTime = 0;

    DWORD    dwTime;

    UINT    uTermTime = 1;


    // 타이머의 시간간격 설정(ms)

    timeBeginPeriod(uTermTime);


    // 시작 시간

    dwStartTime = timeGetTime();


    Sleep(10);


    // 경과 시간

    dwEndTime = timeGetTime();


    // 경과 시간 얻기

    dwTime = dwEndTime - dwStartTime;

    printf("경과시간 = %d msec\n", dwTime) ;


    // 타이머 종료(ms)

    timeEndPeriod(uTermTime);

}

1. winxp cd를 이용하여 cd-rom부팅  

2. winxp 복구선택 --> R 키 입력

도스 프롬프트가 나오면 복구 준비 완료

C:\>CHKDSK /P 를 입력후 엔터키를 누르고 완료 될때까지 대기

C:\>FIXBOOT 를 입력후  "Y" 키를 누른 후 완료 대기

C:\>EXIT

CD 빼고 재부팅

http://support.microsoft.com/kb/330184/ko

컴퓨터를 시작할 때 "잘못된 Boot.ini" 또는 "Windows를 시작할 수 없습니다." 오류 메시지가 나타난다

기술 자료 ID : 330184
마지막 검토 : 2007년 3월 20일 화요일
수정 : 2.0

현상

Microsoft Windows XP로 업그레이드한 후 컴퓨터를 시작하면 다음과 같은 오류 메시지 중 하나 또는 모두가 나타날 수 있습니다.
잘못된 Boot.ini
다음 파일이 없거나 손상되어 Windows를 시작할 수 없습니다:

Windows\System32\Hal.dll

원인

Boot.ini 파일이 없거나, 손상되었거나, 잘못된 항목을 포함하는 경우 이 문제가 발생할 수 있습니다.

해결 방법

이 문제를 해결하려면 Windows XP CD에서 컴퓨터를 시작하고 복구 콘솔을 시작한 다음 Bootcfg.exe 도구를 사용하여 Boot.ini 파일을 다시 작성해야 합니다. 이렇게 하려면 다음과 같이 하십시오.
1. 컴퓨터를 CD-ROM 또는 DVD-ROM 드라이브에서 시작하도록 구성합니다. 이렇게 하는 방법에 대한 자세한 내용은 컴퓨터 설명서를 참조하거나 컴퓨터 제조업체에 문의하십시오.
2. Windows XP CD-ROM을 CD-ROM 또는 DVD-ROM 드라이브에 넣은 다음 컴퓨터를 다시 시작합니다.
3. "Press any key to boot from CD" 메시지가 나타나면 아무 키나 눌러 Windows XP CD-ROM에서 컴퓨터를 시작합니다.
4. "설치 프로그램을 시작합니다" 메시지가 나타나면 R 키를 눌러 복구 콘솔을 시작합니다.
5. 이중 부팅이나 다중 부팅 컴퓨터에서는 복구 콘솔에서 사용해야 하는 설치를 선택합니다.
6. 관리자 암호를 입력하라는 메시지가 나타나면 입력한 다음 Enter 키를 누릅니다.
7. 명령 프롬프트에서 bootcfg /list를 입력한 다음 Enter 키를 누릅니다. 현재 Boot.ini 파일의 항목이 화면에 나타납니다.
8. 명령 프롬프트에서 bootcfg /rebuild를 입력한 다음 Enter 키를 누릅니다. 이 명령은 Windows XP, Microsoft Windows 2000 또는 Microsoft Windows NT 설치를 위해 컴퓨터의 하드 디스크를 검사한 다음 결과를 표시합니다. 화면에 나타나는 지시에 따라 Boot.ini 파일에 Windows 설치를 추가합니다. 예를 들어, Boot.ini 파일에 Windows 설치를 추가하려면 다음과 같이 하십시오.
a. 다음과 유사한 메시지가 나타나면 Y를 누릅니다.
확인된 전체 Windows 설치: 1

[1] C:\Windows
부팅 목록에 설치를 추가하시겠습니까? (Y/N/A)
b. 다음과 유사한 메시지가 나타납니다.
로드 ID 입력
이것은 운영 체제의 이름입니다. 이 메시지가 나타나면 운영 체제의 이름을 입력한 다음 Enter 키를 누릅니다. 이것은 Microsoft Windows XP Professional 또는 Microsoft Windows XP Home Edition입니다.
c. 다음과 유사한 메시지가 나타납니다.
OS 로드 옵션 입력
이 메시지가 나타나면 /fastdetect를 입력한 다음 Enter 키를 누릅니다.

참고 화면에 나타나는 지시는 컴퓨터의 구성에 따라 다를 수 있습니다.
9. exit를 입력한 다음 Enter 키를 눌러 복구 콘솔을 닫습니다. 컴퓨터가 시작되고 "시작할 운영 체제를 선택하십시오" 메시지가 나타날 때 업데이트된 부팅 목록이 표시됩니다.

추가 정보

Bootcfg.exe 도구에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
291980 (http://support.microsoft.com/kb/291980/) Bootcfg 명령과 그 용도에 대한 설명
복구 콘솔에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
289022 (http://support.microsoft.com/kb/289022/) Windows XP에서 Boot.ini 파일을 편집하는 방법
307654 (http://support.microsoft.com/kb/307654/) HOWTO: Windows XP에서 복구 콘솔 설치 및 사용




Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹 (http://support.microsoft.com/newsgroups/default.aspx)에 참여하시기 바랍니다.

본 문서의 정보는 다음의 제품에 적용됩니다.
Microsoft Windows XP Professional
Microsoft Windows XP Home Edition
키워드: 
kberrmsg kbenv kbprb KB330184
1. "오늘까지"라는 말은 "내일 아침까지"라는 말이다.

2. 프로그램은 내가 원하는대로 움직이지 않는다. 타이핑대로 움직인다.

3. 요구 사양은 프로그램을 완성한 후에 추가된다.
    기본 사양은 완성품을 고객이 보고 나서 결정된다.
    상세 사양은 사용자가 프로그램을 사용해 본 이후에 결정된다.

4. 소프트웨어 설계에는 두 개의 방법이 있다.
   하나는 결함이 있을 수 없을 정도로 단순하게 만드는 방법이다.
   다른 하나는, 분명한 결함을 눈치채기 어려울 정도로 복잡하게 만드는 방법이다.

5. 코드는 개발 현장에서 사용하는 것이 아니라 납품처에서 사용하는 것이다.
    디버그는 납기일까지 하는 것이 아니라, 납품된 이후에 하는 것이다.

6. 프로그래머를 죽이기 위해서는 칼이 필요없다.
   프로그램의 요구조건을 3번만 바꾸면 된다.

7. 다른 사람을 믿으라. 그 사람이 해결해줄지도 모른다.
   주의사항 - 먼저 자신을 의심해라.

8. 개발에 마지막은 없다. 출시만이 있을 뿐이다.

9. 클라이언트의 요구사항이 제 아무리 뒤늦게 추가되어도 납기일은 변하지 않는다.
    이것을「납기 불변의 법칙」이라고 한다.

10. 우리의 고객들은 물과 기능추가를 공짜라고 생각하고 있다.

11. 주머니가 짠 고객일수록 잔소리가 많다.

12. 개발 스케줄은 산수를 무시하며 짜여진다. 영업과는 1+1=2를 이해하지 못하는 사람의 모임이다.

13. 한 명이 쓰러지면 모두가 쓰러진다.

14. 버그가 너무 심하다? 걱정마라. 어느 순간 그것은 기본 사양이 될 것이다.

15. 좋은 설계는 한 명의 천재보다 세 명의 범재를 요구한다.
     나쁜 설계는 백명의 범재보다 한 명의 천재를 요구한다.

16. 고객에게 시스템 엔지니어는 부하이며, 프로그래머는 가축이다.
     시스템 엔지니어에게 고객은 돈이다.
     프로그래머에게 고객은 보이지 않는 악성 바이러스다.

17. 돈과 시간만 있으면, 그 어떤 시스템이라도 만들 수 있다고 생각하는가?
     웃어라. 그 기회는 영원히 주어지지 않는다.

18. 품질은 사양 변경의 수와 규모에 의해, 얼마나 열화될지 결정된다.

19. 영업과는 공상이 실현된다고 생각하는 몽상가이다.
     시스템 엔지니어는 넘을 수 없는 벽이 없다고 믿는 모험가이다.
     프로그래머와는 몽상가와 모험가에 의해 칠흑의 바다에 내던져진 표류자이다.

20. 유능한 프로그래머가 프로그램 설계개념도를 받아들고 최초로 하는 일은, 프로그램의 목적을 이해하는 것이다. 그리고 그 다음으로 하는 일은, 지정된 방법과 시간 안에는
도저히 그 목적을 완수할 수 없다는 사실을 시스템 엔지니어에게 이해시키는 일이다.

21. 프로그램이란, 운과 감에 의해서 작성되는 기적이다.
     운과 감이 없다면, 그 기간 내에 그러한 목표를 실현될 수 있을 리 없다.
     따라서 사양 변경은 기적에 트집을 잡는 건방진 행위이며, 사양 추가는 기적이 두 번 일어날 것으로 믿는 무모한 행위이다.

22. 시스템 엔지니어는 지구력, 프로그래머는 순발력.

23. 정시에 퇴근하면, 일이 늘어난다.

24. 완벽한 프로그램은 완벽한 시간과 돈을 필요로 한다.
     미국의 국가 예산을 무제한으로 사용하는 NASA마저도, 아직 시간과 돈이 부족하다고 한다.

25. 눈으로 훑어볼 틈이 있다면 움직여라. 뇌세포보다 CPU가 더 해석이 빠르다. 그리고, 그 사이, 쉴 수 있다.

26. 불편함을 버그라고 부를 것인가, 사양 상의 제한 사항이라고 부를 것인가는 남겨진 개발일자와 납기일에 의해 결정된다.

27. 정장 대신 캐쥬얼을 입고 출근하는 "캐쥬얼 데이"를 세간에서는 휴일이나 공휴일이라고 부르는 것 같다.

28. 프로그램은 머리로 기억하지 않는다. 몸으로 기억한다.

29. 내일 쉴 수 있다면 오늘 죽어도 괜찮다.

30. 고객은 거짓말을 한다.
     영업은 꿈을 말한다.
     시스템 엔지니어는 공상을 이야기한다.
     프로그래머는 과묵해진다. (혼잣말은 많아진다)

31.「네, 할 수 있습니다」라고 말하기 전에 10초만 곰곰히 다시 생각해보라.

32. 프로그래머는 1분 생각하고 1일을 코딩에 소비한다.
      1시간 생각하고 1시간 코딩하는 대신에 말이다.

33. 납품 이후의 디버그는 버그를 부른다.

34. 세 개의 디버그는 하나의 버그를 낳는다. 이것을 버그의 엔드리스 루프라고 한다.

35. 안 좋은 예감은 반드시 적중한다. 그러나 프로그래머는 그 안 좋은 예감에 반응하지 않는다. 그것은 시스템 엔지니어의 일이다.

36. 아수라장을 해결할 수 있는 방법은 오직, 고객이 돈을 지불하는 것 뿐이다.

37. 아마추어는 버그발견의 천재이다.

38. 아, 그건 마이크로소프트에서만 가능한 주문입니다.

39. 프로그래머가 불만이라고 생각하는 부분은 고객도 반드시 불만이라고 생각한다.

40. 건강하기 때문에, 건강을 해친다.

41. 그건, 당신이 말한 요구조건입니다만.

42. 아, 개발실의 창문은 안 열립니다. 그 이유는 옛날에 한 프로그래머가 그 창문에서···
43. 고객은 최악의 사태를 믿지 않으며, 그 사태에 대한 준비를 악질적인 비용청구라고 생각한다.
시스템 엔지니어는 최악의 사태를 대비하고 준비하려 한다.
프로그래머는 최악의 사태를 누구보다 잘 예상하지만, 무시한다.

44. 만약 다른 직업을 갖게 된다면, 정시퇴근을「도망」이라고 부르지 않는 직업이 좋을 것 같다.

45. 시스템 엔지니어가 프로그래머에게 말하는「상식」은 3시간마다 변한다.

46. 최소한 자기가 쓴 시방서는 읽어주세요.

47. 고객이 시스템 엔지니어에게 사랑받는 방법은, 시스템 개발에는 시간이 곧 돈이라는 사실을 깨닫고 빨리 최종요구조건을 확정하는 것이다.
SE가 고객에게  사랑받는 방법은, 프로그래머에게 미움받는 것이다.

48. 납기일이란, 작업현장이 우리 회사에서 고객의 회사로 바뀌는 날을 의미한다.

49. 가끔 일어나는 버그는 버그가 아니다. 스펙이다.

50. 개발비의 30%는 프로그램의 요구조건을 확정하는데 사용된다.
     개발비의 30%는 프로그램의 요구조건을 변경하는데 사용된다.
     개발비의 30%는 프로그램의 버그를 잡는데 사용된다.
     개발비의 10%만이 프로그램의 개발에 사용된다.

+ Recent posts

티스토리 툴바