출처: http://debugjung.tistory.com/176

Visual C++ 개념: C/C++ 프로그램 빌드
링크

링커 사용에 대한 자세한 내용은 다음 항목을 참조하십시오.

개념

C/C++ 빌드 참조


Visual C++ 링커 옵션
링커 옵션

LINK는 COFF(Common Object File Format) 개체 파일과 라이브러리를 링크하여 실행 파일(.exe)이나 DLL(동적 연결 라이브러리)을 만드는 도구입니다.

다음 표에서는 LINK.exe의 모든 옵션 목록을 보여 줍니다. 이 단원에는 다음 항목에 대한 정보도 포함되어 있습니다.

명령줄에 지정되는 링커 옵션은 대/소문자를 구분하지 않습니다. 즉, /base와 /BASE는 동일하게 취급됩니다.

일부 링커 옵션은 comment pragma를 사용하여 지정할 수 있습니다.

옵션

용도

@

지시 파일을 지정합니다.

/ALIGN

각 섹션의 정렬 방식을 지정합니다.

/ALLOWBIND

DLL을 바인딩할 수 없도록 지정합니다.

/ALLOWISOLATION

매니페스트 조회 동작을 지정합니다.

/ASSEMBLYDEBUG

관리되는 이미지에 DebuggableAttribute를 추가합니다.

/ASSEMBLYLINKRESOURCE

관리되는 리소스에 대한 링크를 만듭니다.

/ASSEMBLYMODULE

MSIL(Microsoft Intermediate Language) 모듈을 어셈블리로 가져오도록 지정합니다.

/ASSEMBLYRESOURCE

관리되는 리소스 파일을 어셈블리에 포함시킵니다.

/BASE

프로그램의 기준 주소를 설정합니다.

/CLRIMAGETYPE

CLR 이미지의 형식(IJW, pure 또는 safe)을 설정합니다.

/CLRSUPPORTLASTERROR

P/Invoke 메커니즘을 통해 호출한 함수의 마지막 오류 코드를 저장합니다.

/CLRTHREADATTRIBUTE

CLR 프로그램의 진입점에 적용하려는 스레드 특성을 지정합니다.

/CLRUNMANAGEDCODECHECK

/CLRUNMANAGEDCODECHECK는 링커가 생성하여 관리 코드에서 네이티브 DLL로 호출되는 PInvoke 스텁에 링커가 SuppressUnmanagedCodeSecurity 특성을 적용할지 여부를 지정합니다.

/DEBUG

디버깅 정보를 만듭니다.

/DEF

모듈 정의 파일(.def)을 링커에 전달합니다.

/DEFAULTLIB

외부 참조를 확인할 때 지정된 라이브러리를 검색합니다.

/DELAY

DLL의 지연 로드를 제어합니다.

/DELAYLOAD

지정된 DLL을 지연 로드시킵니다.

/DELAYSIGN

어셈블리에 부분적으로 서명합니다.

/DLL

DLL을 빌드합니다.

/DRIVER

Windows NT 커널 모드 드라이버를 만듭니다.

/DYNAMICBASE

로드할 때 Windows Vist의 ASLR(Address Space Layout Randomization) 기능을 사용하여 임의로 기준 주소를 지정할 수 있는 실행 가능 이미지를 생성할지 여부를 지정합니다.

/ENTRY

시작 주소를 설정합니다.

/errorReport

내부 링커 오류를 Microsoft에 보고합니다.

/EXPORT

함수를 내보냅니다.

/FIXED

기본 기준 주소에서만 로드할 수 있는 프로그램을 만듭니다.

/FORCE

확인되지 않거나 기호가 두 번 이상 정의된 경우에도 링크를 완료하도록 합니다.

/FUNCTIONPADMIN

핫 패치할 수 있는 이미지를 만듭니다.

/HEAP

힙 크기를 바이트 단위로 설정합니다.

/IDLOUT

.idl 파일과 기타 MIDL 출력 파일의 이름을 지정합니다.

/IGNOREIDL

특성 정보가 .idl 파일로 처리되지 않도록 합니다.

/IMPLIB

기본 가져오기 라이브러리 이름을 무시합니다.

/INCLUDE

기호 참조를 강제 적용합니다.

/INCREMENTAL

증분 링크를 제어합니다.

/KEYCONTAINER

어셈블리에 서명할 키 컨테이너를 지정합니다.

/KEYFILE

어셈블리에 서명할 키 또는 키 쌍을 지정합니다.

/LARGEADDRESSAWARE

응용 프로그램에서 2GB 이상의 주소를 지원하도록 컴파일러에 지시합니다.

/LIBPATH

사용자가 환경 라이브러리 경로를 재정의할 수 있도록 합니다.

/LTCG

링크 시간 코드 생성을 지정합니다.

/MACHINE

대상 플랫폼을 지정합니다.

/MANIFEST

side-by-side 매니페스트 파일을 만듭니다.

/MANIFESTDEPENDENCY

매니페스트 파일에 <dependentAssembly> 섹션을 지정합니다.

/MANIFESTFILE(매니페스트 파일 이름 지정)

매니페스트 파일의 기본 이름을 변경합니다.

/MANIFESTUAC

프로그램 매니페스트에 UAC(사용자 계정 컨트롤) 정보를 포함할지 여부를 지정합니다.

/MAP

맵 파일을 만듭니다.

/MAPINFO

지정한 정보를 맵 파일에 포함시킵니다.

/MERGE

섹션을 결합합니다.

/MIDL

MIDL 명령줄 옵션을 지정합니다.

/NOASSEMBLY

.NET Framework 어셈블리를 만들지 않습니다.

/NODEFAULTLIB

외부 참조를 확인할 때 모든 또는 지정한 기본 라이브러리를 무시합니다.

/NOENTRY

리소스 전용 DLL을 만듭니다.

/NOLOGO

시작 배너를 표시하지 않습니다.

/NXCOMPAT

실행 파일을 Windows 데이터 실행 방지 기능과 호환되는지 테스트한 것으로 표시합니다.

/OPT

LINK 최적화를 제어합니다.

/ORDER

COMDAT을 미리 결정된 순서로 이미지에 배치합니다.

/OUT

출력 파일 이름을 지정합니다.

/PDB

PDB(프로그램 데이터베이스) 파일을 만듭니다.

/PDBSTRIPPED

전용 기호가 없는 PDB(프로그램 데이터베이스) 파일을 만듭니다.

/PGD

프로필 기반 최적화를 위한 .pgd 파일을 지정합니다.

/PROFILE

성능 도구 프로파일러와 함께 사용할 수 있는 출력 파일을 생성합니다.

/RELEASE

.exe 헤더의 체크섬을 설정합니다.

/SAFESEH

이미지에 안전한 예외 처리기 테이블이 포함되도록 지정합니다.

/SECTION

섹션의 특성을 재정의합니다.

/STACK

스택 크기를 바이트 단위로 설정합니다.

/STUB

MS-DOS 스텁 프로그램을 Win32 프로그램에 연결합니다.

/SUBSYSTEM

운영 체제에 .exe 파일의 실행 방법을 지정합니다.

/SWAPRUN

운영 체제에서 링커 출력을 실행하기 전에 스왑 파일로 복사하도록 지정합니다.

/TLBID

링커에서 생성한 형식 라이브러리의 리소스 ID를 지정할 수 있도록 합니다.

/TLBOUT

.tlb 파일과 기타 MIDL 출력 파일의 이름을 지정합니다.

/TSAWARE

터미널 서버에서 실행하도록 디자인된 응용 프로그램을 만듭니다.

/VERBOSE

링커 진행 메시지를 표시합니다.

/VERSION

버전 번호를 할당합니다.

/WX

링커 경고를 오류로 처리합니다.

자세한 내용은 컴파일러 제어 LINK 옵션을 참조하십시오.

AND

출처 :http://blog.naver.com/saojung50?Redirect=Log&logNo=120038406993

Just-in-time 디버깅

WinDbg -I로 실행하면 기본 JIT 디버거로서 설정할 수 있다. 이 명령은 레지스트리 키 HKLM\Software\Microsoft\Windows NT\CurrentVersion\AeDebug를 WinDbg롤 설정한다. JIT 디버거로 설정되면, 응용프로그램인 디버깅중이 아닐 경우에 예외를 던지고 그 예외를 처리하지 않을 경우 WinDbg가 동작하게된다.

 

 예외 디버깅

디버거는 각각의 예외에 2번 통지받는다. 응용프로그램이 예외를 처리하기 전에 first chance exception을 통지받고, 응용프로그램이 그 예외를 처리하지 않을 경우 second-chance excepton을 처리할 기회를 얻게된다. 디버거가 second-chance exception을 처리하지 않는다면, 응용프로그램은 종료한다.

.lastevent 또는 !analyze -v는 예외 기록과 예외가 발생했을 때의 함수의 스택 트레이스를 보여준다. .exr, .cxr 및 .ecxr 명령들을 예외 및 문맥 기록들(context records)을 화면에 표시하는데 사용할 수 있다. sxe, sxd, sxn 및 sxi 명령들을 이용하여 예외에 대해 first-chance 처리 옵션을 변경할 수 있다.

 



77818 c


처음 프로그램을 실행하면..

쓰레드를 생성하게 됍니다.

그 부분에서

First-chance exception이 나오는데요...

디버그 랩에서 보고 브레이크 포인터 까지 거는것 까지 했습니다.

하지마나 어디서 그 부분이 나오는지를 찾지 못하겠더군요..

쓰레드 생성 부분을 제거 하고 프로젝트를 실행하면 나오지는 않는데요..

왜 이런 현상이 나오는지 모르겠습니다.

여러 쓰레드를 생성하지만 특별히 몇개의 쓰레드에서만 나오는거 같은데요..


특별한 원인이 없는거 같은데..잘 모르겠더군요..


해결의 실마리가 있을런지 해서 이렇게 조언을 구합니다.

조언 부탁드리겠습니다.


답글 작성자 : 서우석 등록일 : 2004-06-01 오후 10:34
Re : First-chance Exception...

안녕하세요. 좋은 질문이네요..

우선 First-Chance Exception에 대해서 Microsoft의 KB에서 다음과 같이 소개하고 있습니다.

http://support.microsoft.com/default.aspx?kbid=105675

It is a common practice to use SEH as a signaling mechanism. Some application programming interfaces (APIs) register an exception handler in anticipation of a failure condition that is expected to occur in a lower layer.

When an exception is raised, the handler may correct or ignore the condition rather than allow a failure to propagate up through intervening layers. This is very useful in complex environments such as networks where partial failures are expected and it is not desirable to fail an entire operation just because one of several optional parts failed. In this case, the exception can be handled so that the application does not recognize that an exception has occurred.

However, if the application is being debugged, the debugger sees all exceptions before the program does. This is the distinction between the first and second chance exception: the debugger gets the first chance to see the exception (hence the name). If the debugger allows the program execution to continue and does not handle the exception, the program will see the exception as usual. If the program does not handle the exception, the debugger gets a second chance to see the exception. In this latter case, the program normally would crash if the debugger were not present.

해석 : 하지만 만약 응용 프로그램이 디버깅되고 있는 중이라면, 디버거는 프로그램이 예외를 확인하기 전에 먼저 모든 예외를 감시한다. 이것이 바로 첫번째(first-chance)와 두번째(second-chance) 예외의 차이점이다. 디버거는 프로그램에서 발생하는 모든 예외를 살펴볼 수 있는 가장 첫번째 기회(first-chance라고 하는 이유)를 갖게된다. 만약 디버거가 프로그램 실행을 계속 허용하고 해당 예외를 처리하지 않는다면, 프로그램은 평상시와 마찬가지로 예외를 확인하게 될 것이다. 만약 프로그램이 그 예외를 처리하지 않는다면, 디버거는 프로그램이 처리하지 않은 예외를 최종적으로 다시 한번 확인할 수 있는 두번째 기회(second-chance)를 갖게된다. 후자의 경우에는 일반적으로 디버거가 존재하지 않을 경우에 프로그램이 곧바로 충돌할 것이다.

* 보충 설명 ---------------

일반적으로 first-chance exception이 발생했다는 메시지를 확인했음에도 불구하고 프로그램이 충돌하지 않는 이유는 내부 코드에서 이 예외를 처리하고 있기 때문이라고 보시면 됩니다. 따라서 API를 호출하는 대부분의 경우에는 first-chance exception이 발생했다고 하더라도 무시하면 됩니다(내부적으로 처리가 되고 있기 때문이죠). 물론, first-chance exception을 확인하고 난 후, second-chance exception이 발생하여 프로그램이 충돌하면 당연히 오류를 잡아주어야 겠죠.

If you do not want to see the first chance exception in the debugger, you should disable first chance exception handling for the specific exception code. Otherwise, when the first chance exception occurs, you may need to instruct the debugger to pass on the exception to the program to be handled as usual.


만약 Visual Studio 6.0을 사용하고 계시다면, 이 툴로 first-chance exception을 잡을 방법이 없습니다. 다음 링크에서 WinDBG를 다운로드 하시면 간단하게 잡을 수 있죠. VS.NET에서는 원하는 exception을 선택할 수 있기 때문에 더욱 간단하구요. 물론 BoundsChecker와 같은 프로그램을 사용하셔도 잡으실 수 있을 것입니다. 결국 이 메세지를 디버깅 시에 확인하더라도 API 단에서 발생하는 경우라면 크게 걱정하지 않아도 건강에는 지장이 없다라는 것입니다. ^^

http://www.microsoft.com/ddk/debugging/




답글 작성자 : 박시존 등록일 : 2004-06-11 오후 3:54
Re : First-chance Exception...

 이런 경우에는 Debug -> exception -> 다이알로그 창에서 맨 밑의 항목 Microsoft C++ Exception을 stop always로 설정하셔도 많은 부분을 잡아낼 수 있습니다. 이렇게 해두면 예를 들어 DB exception이 발생하여 보통때는 "~ 테이블을 찾을 수 없습니다.." 정도로 메시지를 뿌려주고 지나가는 경우에도 먼저 브레이크가 걸린 다음에 메시지 박스가 나타나는 것에서부터 쓰레드 관련 오류 메모리 관련 오류( Access Violation을 stop always로 설정)등등 많은 부분이 미리 캐치됩니다. visual studio 6.0에서 사용하는 내용이고 Debug -> exception 메뉴는 프로그램 실행 중에만 활성화됩니다. F5 누르고 프로그램 시작하셔서 설정하시면 됩니다.



답글 작성자 : 관리자 등록일 : 2004-06-11 오후 11:15
Re : First-chance Exception...

좋은 답변 감사합니다. ^^


출처 : http://www.debuglab.com/board/board_detail.aspx?id=128&table=qna&pagenum=10


AND

출처: http://laigo.kr/329

Process 의 crash, hang 덤프를 수집하기 위해 Debug Diag 또는 adplus.vbs 를 흔히 사용하고 있습니다. 하지만 간혹 프로세스 crash 가 발생하였음에도 불구하고 터미널 세션에서 crash dump 를 수집하지 못하는 경우가 있었습니다. 이런 경우 WinDbg 를 통해서 덤프를 내려받을 수 있습니다. WinDbg 를 사용한 덤프 수집 방법에 대해서 아래와 같이 정리하였습니다.


1. 테스트를 위해 계산기(calc.exe) 프로그램을 실행합니다.
2. WinDbg 실행 - File - Attach to a Process - calc.exe 해당 PID 선택



3. 대상 프로세스(Debuggee)가 정상적으로 Debugger Tool 에 Attach 되면 'g' 명령을 수행하여 Debuggee 가 제어권을 가지도록 넘겨 줍니다.



4. calc.exe 프로세스를 강제 종료합니다. 제어권이 다시 디버거로 돌아옵니다.
eax=00000000 ebx=00000000 ecx=7c7d0000 edx=7c9ae120 esi=7c93de6e edi=00000000
eip=7c93e514 esp=0007fde8 ebp=0007fee4 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
ntdll!KiFastSystemCallRet:
7c93e514 c3              ret



5. .dump 명령을 수행하여 메모리 덤프 파일을 내려 받습니다.
0:000> .dump /f d:\calc_crash.dmp
Creating d:\calc_crash.dmp - mini user dump
Dump successfully written

※ /f : Creates a complete memory dump, /o : overwrites an existing dump file  
[참고자료]
AND