Stay Hungry. Stay Foolish(배고픔과 함께, 미련함과 함께) // 좀 배고프더라도 하라 이건가... 아나...고민되네.

.. 내일이 마지막이라 생각하며 살 수 있을까. 슬퍼서 우울증 걸리겠는걸...
1. AutoMemoryLeak.h
 => #include "AutoMemoryLeak.h" 를 해주기만 하면 출력창에 누수가 난곳을 출력해준다.
#if !defined (__AutoDetectMemoryLeak_h__)
#define __AutoDetectMemoryLeak_h__

#if defined(_MSC_VER) && defined (_DEBUG)
#define _CRTDBG_MAP_ALLOC // 메모리 누수를 탐지하기 위해 선언 해주어야 한다.
#include <crtdbg.h>
#if !defined (_CONSOLE)
#include <cstdlib> // for Consol Application
#endif

class __AutoDetectMemoryLeak
{
public:
    __AutoDetectMemoryLeak ()
    {
        _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF |
            _CRTDBG_LEAK_CHECK_DF);

        // Consol Application인 경우
#if defined (_CONSOLE)
        // Send all reports to STDOUT
        _CrtSetReportMode( _CRT_WARN,  
            _CRTDBG_MODE_FILE   );
        _CrtSetReportFile( _CRT_WARN,  
            _CRTDBG_FILE_STDOUT );
        _CrtSetReportMode( _CRT_ERROR, 
            _CRTDBG_MODE_FILE   );
        _CrtSetReportFile( _CRT_ERROR, 
            _CRTDBG_FILE_STDOUT );
        _CrtSetReportMode( _CRT_ASSERT,
            _CRTDBG_MODE_FILE   );
        _CrtSetReportFile( _CRT_ASSERT,
            _CRTDBG_FILE_STDOUT );


        /* new로 할당된 메모리에 누수가 있을 경우 소스상의
        정확한 위치를 덤프해준다.
        *  ※ _AFXDLL을 사용할때는 자동으로 되지만 CONSOLE
        모드에서 아래처럼
        * 재정의를 해주어야만 합니다.
        *    date: 2000-12-05
        */

#define DEBUG_NORMALBLOCK   new ( _NORMAL_BLOCK, __FILE__, __LINE__ )
#ifdef new
#undef new
#endif
#define new DEBUG_NORMALBLOCK

#else

        // Send all reports to DEBUG window
        _CrtSetReportMode( _CRT_WARN,  
            _CRTDBG_MODE_DEBUG  );
        _CrtSetReportMode( _CRT_ERROR, 
            _CRTDBG_MODE_DEBUG  );
        _CrtSetReportMode( _CRT_ASSERT,
            _CRTDBG_MODE_DEBUG  );

#endif

#ifdef malloc
#undef malloc
#endif
        /*
        * malloc으로 할당된 메모리에 누수가 있을 경우 위치
        를 덤프
        * CONSOLE 모드일 경우 crtdbg.h에 malloc이 정의되어
        있지만,
        * _AXFDLL 모드일 경우에는 약간 다른방식으로 덤프 하
        게된다.
        * date: 2001-01-30
        */

#define malloc(s) (_malloc_dbg( s, _NORMAL_BLOCK, __FILE__, __LINE__ ))
    }
};

// 몇 가지 초기화를 생성자를 통해 자동으로 해주기 위해 전역으로 선언한다.
static __AutoDetectMemoryLeak __autoDetectMemoryLeak;

#endif // if defined(_MSC_VER) && defined (_DEBUG)

#endif // __AutoDetectMemoryLeak_h__



1. MiniDump.h
#pragma once

class CMiniDump
{
public:
    static BOOL Begin(VOID);
    static BOOL End(VOID);
};

2. MiniDump.cpp
#include "stdafx.h"
#include "MiniDump.h"
#include <DbgHelp.h>


typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)( // Callback 함수의 원형
    HANDLE hProcess,
    DWORD dwPid,
    HANDLE hFile,
    MINIDUMP_TYPE DumpType,
    CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
    CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
    CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam);

LPTOP_LEVEL_EXCEPTION_FILTER PreviousExceptionFilter = NULL;

LONG WINAPI UnHandledExceptionFilter(struct _EXCEPTION_POINTERS *exceptionInfo)
{
    HMODULE    DllHandle        = NULL;

    // Windows 2000 이전에는 따로 DBGHELP를 배포해서 설정해 주어야 한다.
    DllHandle                = LoadLibrary(_T("DBGHELP.DLL"));

    if (DllHandle)
    {
        MINIDUMPWRITEDUMP Dump = (MINIDUMPWRITEDUMP) GetProcAddress(DllHandle, "MiniDumpWriteDump");

        if (Dump)
        {
            TCHAR        DumpPath[MAX_PATH] = {0,};
            SYSTEMTIME    SystemTime;

            GetLocalTime(&SystemTime);

            _sntprintf(DumpPath, MAX_PATH, _T("%d-%d-%d %d_%d_%d.dmp"),
                SystemTime.wYear,
                SystemTime.wMonth,
                SystemTime.wDay,
                SystemTime.wHour,
                SystemTime.wMinute,
                SystemTime.wSecond);
           
            HANDLE FileHandle = CreateFile(
                DumpPath,
                GENERIC_WRITE,
                FILE_SHARE_WRITE,
                NULL, CREATE_ALWAYS,
                FILE_ATTRIBUTE_NORMAL,
                NULL);

            if (FileHandle != INVALID_HANDLE_VALUE)
            {
                _MINIDUMP_EXCEPTION_INFORMATION MiniDumpExceptionInfo;
               
                MiniDumpExceptionInfo.ThreadId            = GetCurrentThreadId();
                MiniDumpExceptionInfo.ExceptionPointers    = exceptionInfo;
                MiniDumpExceptionInfo.ClientPointers    = NULL;

                BOOL Success = Dump(
                    GetCurrentProcess(),
                    GetCurrentProcessId(),
                    FileHandle,
                    MiniDumpNormal,
                    &MiniDumpExceptionInfo,
                    NULL,
                    NULL);

                if (Success)
                {
                    CloseHandle(FileHandle);

                    return EXCEPTION_EXECUTE_HANDLER;
                }
            }

            CloseHandle(FileHandle);
        }
    }

    return EXCEPTION_CONTINUE_SEARCH;
}

BOOL CMiniDump::Begin(VOID)
{
    SetErrorMode(SEM_FAILCRITICALERRORS);

    PreviousExceptionFilter = SetUnhandledExceptionFilter(UnHandledExceptionFilter);

    return true;
}

BOOL CMiniDump::End(VOID)
{
    SetUnhandledExceptionFilter(PreviousExceptionFilter);

    return true;
}

3. 사용예제
class MyObject
{
public:
    BOOL mIsOpened;
};
//////////////////////////////////////////////////////////////////////
    CMiniDump::Begin();

    MyObject* Test = new MyObject;
    Test = NULL;
    Test->mIsOpened = TRUE;    

    CMiniDump::End();
//////////////////////////////////////////////////////////////////////
// 1. 디버그모드로 생성된 exe를 실행시 dmp 파일이 생성된다.!!
// 2. 2007-11-7 23_22_39.dmp ( Crash Dump File ) 이 생성된다.
// 3. vc80.pdb ( Program Debug Database ) 가 같은 폴더내에 있어야 에러위치를 볼수 있다.
// 4. dmp 파일을 실행시킨후 디버깅 해주면 에러난곳에 멈춘다.
//////////////////////////////////////////////////////////////////////


Tag | ,

멀티스레드에 안전해지자.

from Study/Network 2007/11/07 20:10 view 26289
- CriticalSection 의 Enter, Leave 를 지역변수로 선언하여 데드락을 피하는 클래스

1.  CRITICAL_SECTION의 기능형 클래스
#pragma once

class CCriticalSection
{
public:
    CCriticalSection(VOID)
    {
        InitializeCriticalSection(&mSync);
    }

    ~CCriticalSection(VOID)
    {
        DeleteCriticalSection(&mSync);
    }

    inline VOID Enter(VOID)
    {
        EnterCriticalSection(&mSync);
    }

    inline VOID Leave(VOID)
    {
        LeaveCriticalSection(&mSync);
    }

private:
    CRITICAL_SECTION    mSync;
};

2. Enter, Leave를 지역변수화.
#pragma once

template <class T>
class CMultiThreadSync
{
friend class CThreadSync;
public:
    class CThreadSync
    {
    public:
        CThreadSync(VOID)
        {
            T::mSync.Enter();
        }

        ~CThreadSync(VOID)
        {
            T::mSync.Leave();
        }
    };

private:
    static CCriticalSection mSync;
};

template <class T>
CCriticalSection CMultiThreadSync<T>::mSync;


- 사용 예제 ( 메모리 풀 )

more..



포인터 변수의 임시변수 문제.

from Study/Error 2007/11/07 12:21 view 24993
아래와 같이 소켓이 생성될때 소켓을 복사해주고 소멸시킬때 close 해줄 때 임시변수는 큰 문제가 된다.

CClientSocket::CClientSocket( SOCKET client )
: m_client( client )
{
}

CClientSocket::~CClientSocket(void)
{
    Disconnect();
}

void CClientSocket::Disconnect()
{
    if( m_client == INVALID_SOCKET )
        return;

    closesocket( m_client );
    m_client = INVALID_SOCKET;
}


vector<CClientSocket> g_Clients;

       SOCKET client = server.Accept(&clientInfo);
        assert( client != INVALID_SOCKET );

        g_Clients.push_back( client );
=> push_back 할때 임시 변수가 생성되는데 이때 생성자가 또 호출되게 된다. 그리고 사라진다.
이것이 문제다. client는 서로간의 참조관계가 되므로 같이 죽게 된다. client는 SOCKET이고 g_Clients는 CClientSocket 이므로 암시적인 형변환이라고 해야하나 이를 위해 임시변수가 생성되는것이다.

vector<SOCKET> g_Clients;
=> 그런데 SOCKET으로 한다면 죽지 않는다. 임시변수를 생성하지 않아서 그런거 같은데 -_-.. 모르겠다. 


 소멸자에서 특정 포인터를 닫을 경우엔 조심 또 조심하자. 임시변수가 생성되도 소멸자가 호출되니깐.!!
Tag |

UDP Hole Punching

from Study/Network 2007/11/06 17:23 view 22047
 사설망에서 통신을 어떻게 하지? -_-.. 아직 몰라.

1. 구글 검색결과

2. GPG(1)

3. http://pasv.zerois.net/

4. http://www.h-online.com/security/How-Skype-Co-get-round-firewalls--/features/82481

프로그래밍이 좋다~

from Link 2007/11/06 16:52 view 23836
시스템,해킹
1. http://hdp.null2root.org/ - 문서를 잘 번역해놨다.
2. http://www.zap.pe.kr/index.php - 하드웨어와 소프트웨어의 멋진 만남.
3. htp://beist.org/research/index.html - 번역자료, 연구자료.


MFC

1. 유캔코드 - 자기네 라이브러리와 MFC 코드를 보여준다.
2. kukdas - 수많은 팁이 나온다.
3. MSDN - MFC 테크니컬 노트.( 좋다..)

Netwrok

1. http://blog.naver.com/h64d5791 - 온라인 서버 프로그래밍 저자 블로그(피드백)
2. http://www.alhem.net/ - 와... SQL, SOCKET 오픈소스..와..


기타

1. http://hanulso.knu.ac.kr/~junho85/ - 읽어볼 거리가 가득한 곳. API, MFC 기타 등등
2. 게임회사 이야기 - 만화로 보는 게임회사
3. http://msdn2.microsoft.com/en-us/bb629407.aspx - MS에서 해주는 동영상 강의....영..어.



 

Tag |
가답안 보러가기~  아싸 64점-_-v.

 사당중학교에서 정보처리기사 실기를 봤는데 학교가 동산위에 짓어 놔드만-_-.. 아나 가뜩이나 엊그제 축구해서 잘 걷지도 못하는데..ㅠ_ㅠ.. 어쨋든 이번 시험은 꽁자 문제를 많이 줘서 무난하게 합격의 길이 보인다.

저번 시험엔 DB를 다 틀려서 56점 맞았는데 이번엔 DB에서 4문제가 꽁짜고 1문제가 좀 애매한데 쩝.. 60점만 맞음 되지.. 흐흐흐흐 가답안이나 어서 나와라..

1. 알고리즘 .. 30점 보장 과목 오예..
 
그레이코드랑 2진수 구하는건데 솔직히 변환 표를 제시 안해줬으면 못 풀었다....-_-..

 Input(1) == 1 이면 Gray 였나 -_-..
 
암튼 그레이라면
 Binary(1) = Input(2) 넣어주고
Binary(T+1) 에 Input(T+2) 과 Binary(T)가 같다면 0 다르다면 1을 대입

2진수라면
Gray(1) = Input(2) 넣어주고
Gray(T+1) 에 Input(T+1)과 Input(T+2)가 같다면 0 다르다면 1을 대입


2. 영어..아나..-_-..

Java is an object-oriented language similar to C++, but simplified to eliminate language features that cause common programming errors. Java source code files (files with a java extension)are compiled into a format called byte code (files with a class extension), which can then be executed by a Java interpreter. Compiled Java code can run on most operating systems, including UNIX, the Macintosh OS, and Windows. Byte code can also be converted directly into machine language instructions by a just-in-time compiler(JIT).

자바는 C++와 같이 개체지향적언어지만 애러가 자주일어나는 컴퓨터 언어의 특성을 제거하기위해 단순화 되었다. 자바의 소스 코드 파일 ( 자바의 확장 파일)는 코드 파일이라는 포멧으로 컴파일 된다. 그것으로 자바 인터프리터가 실행되게 되는것이다. 컴파일된 자바 코드는 유닛스 메킨토시 오에스 윈도우와 같은 대부분의 오퍼레이팅 시스템이서 작동된다. 바이트 코드는 또한 바로 기계어 구문으로 컴파일 된다.

Java is a general purpose programming language with a number of features that make the language well suited for use on the World Wide Web. Small Java appications are called Java applets and can be downloaded from a Web server and on your computer by a Java-compatible Web browser, such as
Netscape Navigator or Microsoft Internet Explorer.

자바는 인테넷 사용에 적합한 특성을 가진 범용 프로그램 언어이다. 작은 자바 응용프로그램은 자바 에플릿이라고 하며 인터넷과 마이크로 익스플로러 혹은 네스케이프 네비게이터와 같은 자바 컴페터블에서 당신의 컴퓨터로 다운로드 받을 수 있다.

블랙홀~

from 잡담 2007/11/01 09:54 view 30221
나비선을 타고 가보자`,.`.
2광년이 1000년이랬으니깐 90*1000 년을 날아보세~후덜덜..

31일(현지시간) 미국 항공우주국이 공개한 블랙홀 일러스트레이션.

미국 천문학자들은 최근 지구에서 180 광년 떨어진 카시오페이아 자리 근처에서 거대한 블랙홀을 가진 항성(왼쪽 상단)을 발견했다.이 항성은 태양보다 24-33배 정도 더 큰 것으로 추정되고 있다.

사용자 삽입 이미지
Tag | ,
네이버는 이런게 좋단 말야~ -_-..광고랑 검색은 좀 맘에 안들지만..

usb내에  autorun.inf 파일 생성후 아래문장 입력.
 아 참고로 autorun.inf는 바이러스 공격대상이므로 읽기전용해놓자.
[autorun]
icon = my.ico     //아이콘경로
label = myname  //이름

안전하게 제거는 안해도 된다.
사용자 삽입 이미지



Tag |