심볼파일을 이용하여 디버깅을 하다보면 PDB 파일이 맞지 않아 디버깅을 진행하지 못하는 경우가 있다.

이때 아래 블로그에 나와 있는 것처럼 심볼파일을 강제 로딩하게 되면 디버깅이 가능해 진다.

소스가 변경되지 않았더라도 컴파일만 다시 하더라도 심볼파일의 타임 스탬프가 달라지기 때문에 심볼파일을 로딩하지 못 할때 유용하다.

블로그 이름  : 달토끼 대박나라

관련 글 링크 : http://kuaaan.tistory.com/380

 


Visual C++6.0 사용했을 때 원인을 알 수 없이 일정 기간이 지나면 Debug Error가 발생하는 경험을 한적이 있었습니다. 신입 시절 경험이 없는 터라 정말 고생 많이 했었습니다. 그때 참 이상하게도 CString을 사용하는 부분에서 Debug Error가 났었습니다. 그래서 대책방안으로 Thread나 Timer에서 CString을 사용하는 부분을 모두 문자열 배열로 바꿨던 기억이 납니다. 최근에 디버깅 작업을 하다가 좀더 확실하게 알게 되었습니다. 디버그 에러가 발생 했을 때의 콜스택들을 보니 대부분 아래와 같이 메모리 할당을 실패한 경우였습니다.

 

 

VC++6.0의 디버그 모드에서 new를 사용 할 경우 버그가 있다는 사실은 예전에 들어서 알고 있었는데 자세히 찾아보지 않아서 이번 기회에 검색해 보았습니다. 첨부한 문서와 같이 해당 버그는 이미 잘 알려진 버그로 VC++ 7.1에 수정되었다고 합니다.

 

아래에 나와 있는 것 처럼 Debug Mode로 실행 파일을 만들 경우 메모리를 할당 횟수가 2억회를 초과하게 되면 lRequest가 -1이 되면서 Exception Breakpoint에 의해 프로그램이 중단 되는 것이다.

 

 

해당 버그와 CString과의 관계는 아시다시피 CString 내부적으로 메모리를 동적으로 할당하기 때문에 밀접한 관계가 있는 것이죠.

 

실제로 테스트도 해보았는데 정말 VC++6.0으로 간단히 프로그램 작성해서 디버그 모드로

컴파일 하여 프로그램 실행 시켜보니 1시간만에 프로그램이 죽어 버리네요.

 

 

관련자료 및 글들은 해외 싸이트에서 많이 찾아 볼 수가 있는데 국내 싸이트에서는 좀처럼 찾기가 힘든것 같아서 이렇게 글을 올려 봅니다.

관련 링크

http://computer-programming-forum.com/81-vc/83f52a9d80a4edd0.htm

 

Bug in CRT Ms Visual CPP libraries.pdf

 

FIX- Visual CPP 6.0 응용 프...모드를 해제 한 후 중단 될 수 있습니다.pdf

 

FIX- Your Visual CPP 6.0 elease it in debug mode.pdf

 

MSVC run-time bug in Malloc in Debug Mode.pdf

Release Mode로 컴파일 하여 실행 파일을 만들었을 때 어려운 상황 중에 하나가 바로 프로그램이 비정상 종료 되는 문제이다.

Exception이 발생 될 때 Dump File을 생성되도록 프로그램을 작성해 두었지만 이 부분이 제대로 동작하지 않고 프로그램이 그냥 죽을 때가 있다. 아무런 메세지나 덤프파일 없이 프로그램이 종료 되는 것이다. (프로그램이 사라진다. -_-;;)

이런 문제는 내 경험으로 메모리 관련 문제가 있을 때 나타나는 문제 이다. 실제 테스트 프로그램을 작성하여 스택이나 힙을 Crah하게 되면 문제를 재연 할 수 있다.

만약 프로글램이 간단한 정도라면 문제가 어디에서 발생되었는지 쉽게 찾을 수 있겠지만 프로그램 구조가 복잡하고 특히 멀티쓰레드 환경이라면 문제의 원인을 찾기가 쉽지 않다.

이러한 경우에 procdump.exe 파일을 사용하면 도움이 된다.

Microsoft TechNet :: Windows SysInternals 블로그에서 다운 받을 수 있다. [여기]

https://technet.microsoft.com/en-us/sysinternals/dd996900    <- 링크가 안열리면 주소를 복사해서 사용하세요.

c> procdump.exe -ma -w -e -h ProcessName.exe D:\MY_CDA\

이렇게 입력하면 아래와 같은 뜻이 된다.

-ma : full dump file을 만들어라.

-w : 지정한 실행 파일이 실행 될 때 까지 기다려라

-e : Exception이 발생하면 dump을 만들어라.

-h : Hang (응답없음)이 발생하면 dump를 만들어라.

이렇게 해서 생성된 덤프파일을 windbg.exe를 이용하여 분석해 보면 프로그램의 어디 부분에서 문제가 된 것인지 쉽게 알 수가 있다.

google-breakpad나 CrashRpt를 사용하려 하였으나 이 방법도 꽤나 간단 명료해서 마음에 든다.

배치 파일을 함께 활용하면 프로세스와 procdump.exe를 동시에 기동 시킬 수 있어서 프로그램 수정 없이 연동 시킬 수 있다.

Windows SysInternals 블로그에 나와 있는 툴들은 쓰면 쓸수록 놀랍다. Mark Russinovich 씨 고맙습니다.

파일 확장명

형식

내용

.asmx

소스

배포 파일

.asp

소스

Active Server Page 파일

.atp

프로젝트

응용 프로그램 템플릿 프로젝트 파일

.bmp, .dib, .gif, .jpg, .jpe, .png

리소스

일반 이미지 파일

.bsc

컴파일

브라우저 코드 파일

.cpp; .c

소스

응용 프로그램의 소스 코드 파일

.cur

리소스

커서 비트맵 그래픽 파일

.dbp

프로젝트

데이터베이스 프로젝트 파일

.disco

소스

동적 검색 문서 파일.

XML Web services 검색을 처리합니다.

.exe, .dll

프로젝트

실행 파일 또는 동적 연결 라이브러리 파일

.h

소스

헤더(포함) 파일

.htm, .html, .xsp, .asp, .htc, .hta, .xml

리소스

일반 파일

.HxC

프로젝트

도움말 프로젝트 파일

.ico

리소스

아이콘 비트맵 그래픽 파일

.idb

컴파일

클래스 정의와 소스 파일 간의 종속성 정보가 들어 있는 상태 파일. 최소 다시 빌드 증분 컴파일을 하는 동안 컴파일러에서 사용할 있습니다.

/Fd 컴파일러 옵션을 사용하여 .idb 파일 이름을 지정합니다.

자세한 내용은 /Gm(최소 다시 빌드 사용) 참조하십시오.

.idl

컴파일

인터페이스 정의 언어 파일.

자세한 내용은 Windows SDK Interface Definition (IDL) File 참조하십시오.

.ilk

링크

증분 링크 파일.

자세한 내용은 /INCREMENTAL 참조하십시오.

.map

링크

링커 정보를 포함하는 텍스트 파일.

/Fm 컴파일러 옵션을 사용하여 파일 이름을 지정합니다.

자세한 내용은 /MAP 참조하십시오.

.mfcribbon-ms

리소스

리본에 단추, 컨트롤 특성을 정의하는 XML 코드가 포함된 리소스 파일.

자세한 내용은 Ribbon Designer (MFC) 참조하십시오.

.obj, .o

 

컴파일되었지만 링크되지 않은 개체 파일

.pch

디버그

미리 컴파일된 헤더 파일

.pdb

디버그

프로그램 디버그 데이터베이스 파일.

자세한 내용은 .pdb 파일 참조하십시오.

.rc, .rc2

리소스

리소스를 생성하는 리소스 스크립트 파일

.sbr

컴파일

소스 브라우저 중간 파일.

BSCMAKE 위한 입력 파일

.sln

해결책

솔루션 파일

.suo

해결책

솔루션 옵션 파일

.txt

리소스

텍스트 파일. 보통 "추가 정보" 파일

.vap

프로젝트

Visual Studio Analyzer 프로젝트 파일

.vbg

해결책

호환 가능한 프로젝트 그룹 파일

.vbp, .vip, .vbproj

프로젝트

Visual Basic 프로젝트 파일

.vcxproj

프로젝트

Visual C++ 프로젝트 파일.

자세한 내용은 프로젝트 파일 메이크파일 참조하십시오.

.vdproj

프로젝트

Visual Studio deployment 프로젝트 파일

.vmx

프로젝트

매크로 프로젝트 파일

.vup

프로젝트

유틸리티 프로젝트 파일

'Programming > VC++' 카테고리의 다른 글

MFC에서 DB 사용  (0) 2013.05.22
VS2008 단축키  (0) 2012.10.16
Visual Studio 소스 정렬 단축키  (0) 2012.10.16
OCX 등록 방법 링크  (0) 2012.04.25
VC++ 6.0 Add-In  (0) 2011.10.27

MFC 확장 DLL을 이용하여 작업하는 경우가 많은데

DLL안에 Dialog를 만들 때 마다 말썽이다.

이번에는 DLL 안에서 Dialog의 Create함수를 호출 하였으나 Assertion이 발생하였다.

결론은 Dialog의 Resource 핸들 때문이었는데

DLL을 링크해서 사용할때 Extention Class를 EXE의 Global Type에서 특정 클래스의 멤버 변수로

선언해 줌으로써 문제를 해결 하였다.

몇가지 삽질했던 점과 새롭게 알게된 사실을 정리해보자.

MFC에서 DB를 사용할때 마다 스트레스를 너무 많이 받는다.
내가 사용하고 있는 방식이 잘못되었을 수 있겠지만.
DB를 사용하는데 있어서 불편한 점이 너무 많다.
MDB를 사용하는데 있어서 몇가지 제약사항들이 따르는데 이러한 제약 사항이 없는 것을 찾아야 겠다.

■ 문제점.
1.MDB 버전을 제대로 지정해 주지 않을 경우 Exception Error 가 발생한다.
아래와 같은 코드를 이용하여 버전 맞춰 주어야 한다.
//액세스200용 mdb파일 사용하기
AfxGetModuleState()->m_dwVersion = 0x0601;
AfxDaoInit();
2. 일반적으로 사용할때는 잘 돌아가던 함수가 Static 함수 내에서 호출하게 되면 Error가 발생 한다.
왜 에러가 발생되는지 아직도 원인을 모르겠다. 에러를 우회하여 사용하는 방법은
다이얼로그 쪽으로 Message를 보내서 Message receive 함수 내에서 database 핸들링 함수를 호출
하게 되면 Error가 발생 하지 않는다.

3. 데이터를 수정/삽입/삭제 함에 따라 파일이 용량이 커진다.

파일을 압축해주지 않으면 DB 파일이 깨지게 된다.

4. 데이터 관리 툴이 제대로 지원되지 않는다.

2000버전의 MDB를 사용 했을 경우 access2010으로 파일이 열리지 않는다.

최근에는 업데이트가 되어서 2000에서 만들어진 파일도 Access2010에서 열리는데

얼마전까지 열리지 않아서 많이 불편했다.

DB를 많이 쓰지 않고 보통 1~2개의 프로세스가 Local에서만 사용하는 경우에 MDB를

사용하고 있지만 불편해도 너무 불편한것 같다. 방식을 바꾸던지 아니면 MDB가 아닌

다른 DB를 찾아봐야 할 것 같다.

'Programming > VC++' 카테고리의 다른 글

VS2010 파일 확장자  (0) 2014.10.07
VS2008 단축키  (0) 2012.10.16
Visual Studio 소스 정렬 단축키  (0) 2012.10.16
OCX 등록 방법 링크  (0) 2012.04.25
VC++ 6.0 Add-In  (0) 2011.10.27

멀쩡하게 컴파일되던 프로젝트가 Error가 발생한다.

분명히 뭔가를 한것 같은데 기억은 잘 안난다. 

소스코드를 크게 수정한것도 아닌데 말이다...ㅜㅜ

예전에도 이 문제 때문에 한참을 고생했던 기억이 난다.

그런데 어떻게 해결 했는지는 기억이 나지 않는다.

이번에 또 같은 문제를 만난김에 기록해 둬야 겠다.

컴파일을 하면 아래 사진과 같이 LNK2001 Error가 발생한다.

LNK2001 Error는 정의는 되어 있는데 선언이 되어 있지 않은 경우에 발생한다.

컴파일 에러는 발생하지 않지만 Link 동작시에 선언부가 없어서 에러가 발생하는 것이다.

프로젝트 어디에도 해당 함수나 클래스를 사용하는 곳이 없는데....

아무리 뒤져봐도 소스상의 문제는 찾을 수 없었다. 다행히 작업전에 백업해 두었던 소스가 있어서 

컴페어로 비교를 해보니 clw 파일이 틀린거다.

A라는 프로젝트에 B라는 프로젝트를 추가해서 사용하고 있었는데

A라는 프로젝트의 clw 파일에 B프로젝트의 파일이 들어가 있지 않은가.

그래서 A프로젝트의 File View를 열어서 보니 문제의 파일(Trouble.cpp)이 프로젝트에 들어가 있는것을 볼 수 있었다.

이파일을 삭제해 주었더니 문제가 해결되었다. 예전에 마우스 클릭을 잘못해서 문제가 발생된것으로 생각했지만.

VC6.0의 버그인것으로 생각된다. 다시는 이문제로 고생하지 말아야지..




///////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////////////

방금 작업하다가 같은 현상이 발생 되었는데 A 프로젝트를 활성화 시켜서 작업하다가

B 프로젝트의 파일을 고치는 작업을 하다보면 Visual Studio가 해당파일을 추가하겠냐고 물어본다.

메세지 박스를 잘 읽어보지 않고 YES 버튼을 누른것이 화근이구나....-_-;;;;;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////////////

실제로 띄는 메세지는 아래와 같다.

이메세지가 뜨는 경우는

1. A프로젝트와 B 프로젝트에 CCommon 이라는 클래스가 있다.

2. A프로젝트가 활성화 된 상태에서 B 프로젝트의 Common.cpp를 수정하고 있다.

3. CCommon class에 멤버변수를 추가하고 싶어서 F12를 이용하여 CComm의 헤더파일로 이동한다.

    이때 헤더파일은 B 프로젝트의 Common.h가 아니라 A 프로젝트의 Common.h이다.

4. B 프로젝트의 Common.cpp를 모두 수정하고 Ctrl+F7을 눌러서 컴파일을 시도하면 위 메세지가 뜬다.

5. Yes를 누르게 되면 A프로젝트에 해당 파일이 추가 되면서 LNK Error 및 컴파일 Error를 유발 시킨다.



Ctrl + Tab : 열어놓은 파일 왔다 갔다 

Ctrl + L :한줄을 잘라내기 

Tab : 들여쓰기 

Shift + Tab : 내어쓰기

F4 : 다음 에러메세지로 이동

Alt + F8 : 들여쓰기 자동 조정

Ctrl + Shift + F8 : 열 블럭

Alt + E + I : 프로젝트 내의 모든 파일에서 찾기

Ctrl + ] : 괄호 짝 찾기

Ctrl + F2 : 북마크 설정 (Ctrl+K K)

F2 : 북마크로 이동

F9 : 현재 커서위치에 BreakPoint를 설정/해제

Ctrl + Shift + F9 : 모든 브레이크 포인트 해제 


Ctrl + B : 브레이크 포인트 관리 메뉴

Ctrl + Spacebar : 멤버목록 팝업창

Ctrl + U : 모두 소문자로

Ctrl + Shift + U : 모두 대문자로

Ctrl + Shift + 8 : Tab은 ^ 로 공백은 . 으로 보여줌

Ctrl + Shift + R : 매크로 기록

Ctrl + Shift + P : 매크로 실행


실행 : Ctrl + F5 

컴파일 : Ctrl + F7 입니다.


[찾기 HOTKEYS]

F8 : 찾기에서 다음 항목으로 이동 

Ctrl + H : 찾아 바꾸기 

Ctrl + F : 찾기 

F3 : 다음 찾기 

Ctrl + A : 전체선택 

Ctrl + I : 찾기를 한 다음 다음으로 이동하는 키 

Ctrl + Shift + I :  찾기를 한 다음 이전으로 이동하는 키


Ctrl + N  : 새 프로젝트

Ctrl + Space : 인텔리센스 출력

Ctrl + F5 : 빌드 후 프로그램 실행

F5 : Debugging 모드로 작동

F9 : Break Point

Ctrl + F2 : 북마크

F2 : 북마크로 이동

F10 : Debugging 모드로 작동하되 엔트리 포인트부터 시작

Ctrl + F10 : Debugging 모드로 작동하되 커서의 위치까지

Alt + F8 : 들여쓰기 정리

Ctrl + Shite + Space : 현재 가르키고 있는 함수의 매개변수

Alt + B -> E : Clean

Alt + B -> R : Rebuild All

Ctrl + E : 현재 괄호랑 맞는 괄호를 찾아준다.

Alt + F7 : Project Setting

Ctrl + H : 바꿈

Ctrl + F : 찾기

Alt + E -> I : 여러파일에서 찾기

Ctrl + W : 클래스 위자드 (MFC 코딩시에만 사용)

Alt + 2 : Output 윈도우

Alt + 0 : Workspace 윈도우

Alt + MouseMove : 컬럼 Selection


[Debug 모드]

F10 : Step Over (다음줄로)

F11 : Step Into (함수 안으로 들어감)

F5 : 다음 BreakPoint 까지 작동

Alt + 7 : Call Stack 윈도우

Alt + 3 : Watch 윈도우

Shift + F11 : 현재 루틴에서 빠져나온다.

Shift + F5 : 강제로 디버깅 모드 종료

'Programming > VC++' 카테고리의 다른 글

VS2010 파일 확장자  (0) 2014.10.07
MFC에서 DB 사용  (0) 2013.05.22
Visual Studio 소스 정렬 단축키  (0) 2012.10.16
OCX 등록 방법 링크  (0) 2012.04.25
VC++ 6.0 Add-In  (0) 2011.10.27

Visual Studio 6.0 - Alt + F8
Visual Studio 2005, 2008 - Ctrl + K, F
Visual Studio 2010 - Ctrl + K, D
메뉴에서는 Edit -> Advanced -> Format Selection


'Programming > VC++' 카테고리의 다른 글

MFC에서 DB 사용  (0) 2013.05.22
VS2008 단축키  (0) 2012.10.16
OCX 등록 방법 링크  (0) 2012.04.25
VC++ 6.0 Add-In  (0) 2011.10.27
MFC GridCtrl 사용하기  (2) 2010.08.19

+ Recent posts