<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ioriy2k&#039;s Knowledgebase &#187; Development Tools</title>
	<atom:link href="http://ioriy2k.pe.kr/archives/category/tools/feed" rel="self" type="application/rss+xml" />
	<link>http://ioriy2k.pe.kr</link>
	<description>ioriy2k의 여러가지 지식 저장소</description>
	<lastBuildDate>Mon, 06 Feb 2012 11:01:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Ubuntu에서 Valgrind로 Memory Leak 검사하기 (활용편)</title>
		<link>http://ioriy2k.pe.kr/archives/3864</link>
		<comments>http://ioriy2k.pe.kr/archives/3864#comments</comments>
		<pubDate>Mon, 12 Dec 2011 00:00:46 +0000</pubDate>
		<dc:creator>ioriy2k</dc:creator>
				<category><![CDATA[Development Tools]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Linux, Just For Fun]]></category>
		<category><![CDATA[Leak]]></category>
		<category><![CDATA[Memory]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Valgrind]]></category>

		<guid isPermaLink="false">http://ioriy2k.pe.kr/?p=3864</guid>
		<description><![CDATA[지난 Post에 이어서 Ubuntu에서 Valgrind로 Memory Leak을 검사하는 방법의 활용편으로 Valgrind의 GUI Front-end로 Memory Leak을 검사하는 방법과 Callgrind를 사용하는 간단한 방법, 그리고 Eclipse 내에서 Valgrind를 사용하는 방법을 알아보도록 하겠습니다. 5. 유용한 Front-end Valgrind를 사용해서 Terminal에서 Memory Leak을 검사하는 방법을 알아봤지만, 아무래도 좀 더 보기 편리하고 사용하기 쉬운 쪽이 생산성이 좋을 것입니다. 그래서 이번에는 Valgrind를 위한 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://ioriy2k.pe.kr/archives/3754" title="Ubuntu에서 Valgrind로 Memory Leak 검사하기 (기본편)" target="_blank">지난 Post</a>에 이어서 Ubuntu에서 Valgrind로 Memory Leak을 검사하는 방법의 활용편으로 Valgrind의 GUI Front-end로 Memory Leak을 검사하는 방법과 Callgrind를 사용하는 간단한 방법, 그리고 Eclipse 내에서 Valgrind를 사용하는 방법을 알아보도록 하겠습니다.</p>

<h3>5. 유용한 Front-end</h3>
<p>Valgrind를 사용해서 Terminal에서 Memory Leak을 검사하는 방법을 알아봤지만, 아무래도 좀 더 보기 편리하고 사용하기 쉬운 쪽이 생산성이 좋을 것입니다. 그래서 이번에는 Valgrind를 위한 유용한 Front-end를 소개하려 합니다.</p>
<h4>5.1. Alleyoop Memory Checker</h4>
<p>Alleyoop은 GTK+ 기반으로 만들어진 GUI Front-end입니다. 이 Program은 Valgrind의 Memcheck Tool의 결과를 좀 더 보기 쉽게 표현해 주고 해당 Code를 쉽게 확인할 수 있습니다.</p>
<p><span id="more-3864"></span></p>
<p>먼저 설치를 위해서 Terminal에서 다음과 같이 입력합니다.</p>
<div class="codecolorer-container bash mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">$ </span><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get install</span> alleyoop</div></td></tr></tbody></table></div>
<p>위에서 작성한 Test Program을 가지고 Alleyoop을 사용해서 Memory Leak을 검사해 봅시다. Terminal에서 다음과 같이 입력합니다. (아래의 예는 Source의 Directory가 ~/test, 실행 File이 ./test일 경우)</p>
<div class="codecolorer-container bash mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">$ </span>alleyoop <span style="color: #660033;">-R</span> ~<span style="color: #000000; font-weight: bold;">/</span>test<span style="color: #000000; font-weight: bold;">/</span> .<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">test</span></div></td></tr></tbody></table></div>
<p>-R Option을 사용하면 해당 Directory 내에서 Memory Leak이 발생한 Source Code를 찾게 됩니다. 만약 Memory Leak을 검사할 Program이 Argument(명령행 인자)를 가지고 있다면, 위의 명령에서 검사할 Program 뒤에 그대로 이어서 적으면 됩니다.</p>
<div id="attachment_3825" class="wp-caption aligncenter" style="width: 301px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/11/01-Alleyoop-Preferences.png" rel="lightbox[3864]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/11/01-Alleyoop-Preferences-291x300.png" alt="Alleyoop - Preferences" title="Alleyoop - Preferences" width="291" height="300" class="size-medium wp-image-3825" /></a><p class="wp-caption-text">Alleyoop - Preferences</p></div>
<p>실행한 다음, 설정 -> 기본 설정에서 Memory Leak을 검사하기 위한 설정을 해야 합니다. 위의 그림과 같이 Memcheck Tab에서 Leak Check를 full로, Leak Resolution을 high로 설정하고 OK를 누릅니다.</p>
<div id="attachment_3826" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/11/02-Alleyoop-Run.png" rel="lightbox[3864]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/11/02-Alleyoop-Run-300x300.png" alt="Alleyoop - Run" title="Alleyoop - Run" width="300" height="300" class="size-medium wp-image-3826" /></a><p class="wp-caption-text">Alleyoop - Run</p></div>
<p>그 다음 상단 Toolbar의 Run을 누르면 Program이 실행됩니다. Test Program이 종료된 후에는 위의 그림과 같이 Valgrind의 Memcheck Tool을 통해 얻은 정보가 아래의 Treeview에 표시됩니다.</p>
<p>Memory Leak이 발생한 경우에는 위의 그림과 같이 해당 Source의 일부분과 발생한 Line을 표시해 주기 때문에 쉽게 문제가 발생한 부분을 확인할 수 있습니다.</p>
<div id="attachment_3827" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/11/03-Gedit.png" rel="lightbox[3864]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/11/03-Gedit-300x216.png" alt="Gedit" title="Gedit" width="300" height="216" class="size-medium wp-image-3827" /></a><p class="wp-caption-text">Gedit</p></div>
<p>그리고 Memory Leak을 나타내는 Code를 Double-Click하면 문제가 발생한 부분을 쉽게 편집할 수 있도록 Gedit가 실행되면서 해당 Source에서 Memory Leak이 발생한 Line에 Cursor를 위치시켜 줍니다.</p>
<p>이외에도 Alleyoop을 사용하면 NCURSES(Console 화면 출력을 쉽게 다루기 위한 Library)를 사용한 Console Program도 쉽게 Memory Leak을 검사할 수 있습니다. </p>
<p>NCURSES를 사용한 Program의 경우, Alleyoop에서 Run을 누르면 Alleyoop을 실행한 Terminal에서 Program이 실행되며 Program이 종료되면 결과가 Alleyoop에 표시되게 됩니다.</p>
<h4>5.2. KCachegrind</h4>
<p>KCachegrind는 정확하게 말하면 Memory Leak을 검사하기 위한 Front-end는 아닙니다. 하지만, Program의 Performance 향상을 위해 사용되는 상당히 좋은 Tool로 Valgrind에 대해서 설명하는 이 Post에서 잠깐 다뤄보려 합니다.</p>
<p>KCachegrind는 Valgrind의 도구 중 하나인 Callgrind가 생성한 Profile Data를 시각화하여 보여주는 Tool입니다.</p>
<p>이 Program을 사용하면 AQTime 방식과 유사하게 Callgrind로 분석한 ASCII Data를 보기 편리하게 GUI를 통해 시각화하여 보여줌으로서 사용자에게 편의를 제공합니다. 또한 이 것을 통해서 각 Function 별 Cost(비용)와 호출 관계등을 알 수 있습니다.</p>
<p>먼저, 설치를 위해서 Terminal에서 다음과 같이 입력합니다.</p>
<div class="codecolorer-container bash mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">$ </span><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get install</span> kcachegrind</div></td></tr></tbody></table></div>
<p>설치가 완료되었다면 이제 KCachegrind를 사용하기 위한 Profile Data를 얻어봅시다.</p>
<p>다음과 같이 Terminal에서 입력하여 Test할 Application의 Data를 얻습니다. (아래는 이전에 작성한 test Program의 예)</p>
<div class="codecolorer-container bash mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">$ </span><span style="color: #c20cb9; font-weight: bold;">valgrind</span> <span style="color: #660033;">--tool</span>=callgrind .<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">test</span></div></td></tr></tbody></table></div>
<p>Callgrind도 마찬가지로 Runtime에 수행이 되기 때문에 Program 실행 시에 수행되지 않은 Function에 대한 Data를 얻지 못하는 것을 유의해야 합니다.</p>
<p>실행이 완료되면 Callgrind를 통해서 얻은 Data는 Console에 표시되는 것이 아니라 File(일반적인 경우 callgrind.out.*)로 저장됩니다.</p>
<div id="attachment_3832" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/11/01-Unity-KCachegrind.png" rel="lightbox[3864]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/11/01-Unity-KCachegrind-300x190.png" alt="Unity - KCachegrind" title="Unity - KCachegrind" width="300" height="190" class="size-medium wp-image-3832" /></a><p class="wp-caption-text">Unity - KCachegrind</p></div>
<p>이제 Data도 얻었으니 분석을 위해서 KCachegrind를 실행해 봅시다. Unity Dash에서 개발자 도구를 선택한 다음, KCachegrind를 Click합니다.</p>
<div id="attachment_3833" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/11/02-KCachegrind.png" rel="lightbox[3864]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/11/02-KCachegrind-300x213.png" alt="KCachegrind" title="KCachegrind" width="300" height="213" class="size-medium wp-image-3833" /></a><p class="wp-caption-text">KCachegrind</p></div>
<p>KCachegrind를 실행한 화면입니다. 일부 한글로 번역이 되어있으나 완전치는 않습니다.</p>
<p>분석한 Data를 Load하기 위해서 위의 그림과 같이 Toolbar의 열기를 누릅니다.</p>
<div id="attachment_3834" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/11/03-Select-Callgrind-Profile-Data.png" rel="lightbox[3864]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/11/03-Select-Callgrind-Profile-Data-300x173.png" alt="Select Callgrind Profile Data" title="Select Callgrind Profile Data" width="300" height="173" class="size-medium wp-image-3834" /></a><p class="wp-caption-text">Select Callgrind Profile Data</p></div>
<p>Dialog에서 Callgrind Data가 생성된 Directory로 이동한 다음 Data File을 선택하고 열기를 누릅니다.</p>
<p>만약 Data의 이름을 다른 것으로 변경했다면 아래의 Filter에서 Callgrind Profile Data 대신 All Files를 선택하여 모든 File이 List에 표시되도록 변경한 후 선택하면 됩니다.</p>
<div id="attachment_3835" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/11/04-KCachegrind-Callee-Map-and-Call-Graph.png" rel="lightbox[3864]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/11/04-KCachegrind-Callee-Map-and-Call-Graph-300x213.png" alt="KCachegrind - Callee Map and Call Graph" title="KCachegrind - Callee Map and Call Graph" width="300" height="213" class="size-medium wp-image-3835" /></a><p class="wp-caption-text">KCachegrind - Callee Map and Call Graph</p></div>
<p>Data를 제대로 Load했다면 위의 그림과 같이 표시될 것입니다.</p>
<p>분석을 위해서 간단하게 설명하면, 왼쪽 위의 최고비용 호출 스택은 Program 수행 시에 Cost가 가장 많이 발생한 Function의 순서대로 List에 표시합니다.<br />
(Ir은 CPU에서 계산을 위해 Memory에서 Instruction을 가져오는 것을 나타내는 Instruction Fetch의 Cost(%)를, 호출은 호출 횟수를 나타냅니다.)</p>
<p>그리고 왼쪽 아래의 균일한 프로파일은 Runtime에 수행된 거의 모든 Function(Cost가 너무 낮은 것은 제외됨)의 Cost(%)와 호출 횟수를 표시합니다.<br />
(포함은 각 Function 내에서 호출된 다른 Function의 Cost(%)까지를 포함한 값입니다. 그리고 Self는 호출된 다른 Function을 제외한 Function 자체의 Cost(%)를 나타내며, 호출됨은 해당 Function이 호출된 횟수를 나타냅니다.)</p>
<p>이 외에도, 오른쪽 상단과 하단에서는 균일한 프로파일에서 선택한 Function에 대하여 다음과 같은 정보를 제공합니다.</p>
<ul>
<li>Callers: 해당 Function을 호출한 호출자를 List로 표시합니다.</li>
<li>All Callers: 호출자 뿐만 아니라 호출자를 호출한 호출자까지 포함한 List입니다.(Recursive)</li>
<li>Callee Map: Function 내부에서 호출한 다른 Function의 Cost값을 가지고 Visual한 Map을 표시합니다.</li>
<li>Source Code: Function의 Source가 존재할 경우, 해당 Function의 Code를 표시하며 각 Line 별로 Cost를 표시합니다. Source가 다른 곳에 위치할 경우, 설정 -> KCachegrind 설정 -> Annotations Tab에서 Source Directory를 추가할 수 있습니다.</li>
<li>Callee: Function 내부에서 호출한 다른 Function의 List입니다.</li>
<li>Call Graph: 해당 Function과 호출자와 호출한 다른 Function간의 호출 관계도를 표시합니다.</li>
<li>All Callees: Function 내부에서 호출한 다른 Function에서 또 다른 Function을 호출한 것까지 List로 표시합니다. (Recursive)</li>
<li>Caller Map: 호출자의 Cost값을 가지고 Visual한 Map으로 표시합니다.</li>
</ul>
<p>KCachegrind로 얻은 위와 같은 정보를 통해서 Cost가 많이 발생하거나 호출 빈도가 높은 Function에 대해서 최적화를 수행하거나 설계 구조를 변경함으로서 Application의 Performance 향상을 꾀할 수 있을 것입니다.</p>
<p>KCachegrind의 자세한 기능및 분석 방법을 알고 싶다면 <a href="http://kcachegrind.sourceforge.net/html/Documentation.html" target="_blank">KCachegrind의 Documentation</a>을 참고하기 바랍니다.</p>
<h3>6. Eclipse CDT와 함께 사용하기</h3>
<p>Eclipse CDT를 사용하여 개발하는 C/C++ Project에서도 IDE와 통합하여 쉽게 Valgrind로 Memory Leak을 검사할 수 있습니다.</p>
<p>Eclipse Classic 3.7.1 Indigo의 Linux version(또는 Eclipse IDE for C/C++ Linux Developers 1.4.1)을 통해 사용법을 간단하게 설명해 보도록 하겠습니다.</p>
<p>만약 Eclipse가 System에 설치되어 있지 않다면, <a href="http://ioriy2k.pe.kr/archives/3620" title="Ubuntu에서 Eclipse CDT를 사용하여 Autotools Project 만들기 (Part 1)" target="_blank">Ubuntu에서 Eclipse CDT를 사용하여 Autotools Project 만들기 (Part 1)</a>을 참고하여 설치하기 바랍니다.</p>
<div id="attachment_3811" class="wp-caption aligncenter" style="width: 253px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/11/01-Valgrind-Tools.png" rel="lightbox[3864]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/11/01-Valgrind-Tools-243x300.png" alt="Install Valgrind Tools Integration" title="Install Valgrind Tools Integration" width="243" height="300" class="size-medium wp-image-3811" /></a><p class="wp-caption-text">Install Valgrind Tools Integration</p></div>
<p>Eclipse Classic에서 CDT를 설치한 경우라면 Valgrind를 사용하기 위한 Plugin을 설치해야 합니다. (Eclipse IDE for C/C++ Linux Devlopers를 설치했다면 이 과정은 무시해도 좋습니다.)</p>
<p>먼저 Help -> Install New Software를 Click하면 위와 같은 설치 Dialog가 표시됩니다.</p>
<p>위의 그림에서와 같이 Work with에서 Indigo를 선택하면 아래에 설치 가능한 Plugin의 List가 표시됩니다. </p>
<p>List에서 Linux Tools -> Valgrind Integration (Incubation)을 Check하고 Next를 눌러 설치과정을 모두 진행하면 기본적인 준비는 모두 완료됩니다.</p>
<div id="attachment_3812" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/11/02-Memory-Leak-Code.png" rel="lightbox[3864]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/11/02-Memory-Leak-Code-300x205.png" alt="Memory Leak Code" title="Memory Leak Code" width="300" height="205" class="size-medium wp-image-3812" /></a><p class="wp-caption-text">Memory Leak Code</p></div>
<p>Memory Leak을 검사하기 위한 Source Code가 위와 같다고 가정해 봅시다. </p>
<p>위의 Code에서 malloc() 호출 후에 System에 반환하지 않았기 때문에 Memory Leak이 발생할 것을 알 수 있습니다.</p>
<div id="attachment_3813" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/11/03-Eclipse-Profile.png" rel="lightbox[3864]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/11/03-Eclipse-Profile-300x205.png" alt="Eclipse - Profile" title="Eclipse - Profile" width="300" height="205" class="size-medium wp-image-3813" /></a><p class="wp-caption-text">Eclipse - Profile</p></div>
<p>이제 이 Program을 Valgrind를 통해 Memory Leak을 검사해 봅시다. Run -> Profile을 Click합니다.</p>
<div id="attachment_3814" class="wp-caption aligncenter" style="width: 181px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/11/04-Profile-As.png" rel="lightbox[3864]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/11/04-Profile-As-171x300.png" alt="Profile As" title="Profile As" width="171" height="300" class="size-medium wp-image-3814" /></a><p class="wp-caption-text">Profile As</p></div>
<p>처음 Profile을 실행하게 되면 Profile As Dialog가 위와 같이 표시됩니다. 여기서 Profile With Valgrind를 선택하고 OK를 누릅니다.</p>
<div id="attachment_3815" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/11/05-Valgrind-Memcheck.png" rel="lightbox[3864]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/11/05-Valgrind-Memcheck-300x205.png" alt="Valgrind - Memcheck" title="Valgrind - Memcheck" width="300" height="205" class="size-medium wp-image-3815" /></a><p class="wp-caption-text">Valgrind - Memcheck</p></div>
<p>아래의 Console View에 Program이 실행되면서 출력된 내용이 표시되고, Program이 종료된 이후에 Valgrind View에 Memory Leak이 발생한 내용이 표시됩니다. </p>
<p>Memory Leak이 발생한 내용을 Double-click하거나 Problems View에서 해당 Problem을 Double-click하면 위의 그림과 같이 Memory Leak이 발생한 Line이 선택되면서 쉽게 확인이 가능하게 됩니다.</p>
<h3>7. 마치면서&#8230;</h3>
<p>지금까지 Ubuntu에서 Valgrind를 사용하여 Memory Leak을 검사하는 여러가지 방법들을 알아봤습니다. Console 기반이라 쓰기 어렵다고 느껴질 수도 있지만, Front-end와 같이 사용하면 그다지 어렵게만 느껴지지 않을 것입니다.</p>
<p>Valgrind를 사용하여 Debugging과 Profiling을 수행함으로서, 개발하는 Application에 대한 안정성과 성능을 높이는 계기가 될 수 있기를 바랍니다.</p>
  
<div class="wp_license">
<p><a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/2.0/kr/"><img src="http://i.creativecommons.org/l/by-nc-nd/2.0/kr/88x31.png" alt="Creative Commons Attribution-NonCommercial-NoDerivs 2.0 Korea" class="alignleft" style="margin-top:4px;" />
</a>This work  is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/2.0/kr/">Creative Commons Attribution-NonCommercial-NoDerivs 2.0 Korea</a>.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://ioriy2k.pe.kr/archives/3864/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu에서 Valgrind로 Memory Leak 검사하기 (기본편)</title>
		<link>http://ioriy2k.pe.kr/archives/3754</link>
		<comments>http://ioriy2k.pe.kr/archives/3754#comments</comments>
		<pubDate>Mon, 05 Dec 2011 00:00:47 +0000</pubDate>
		<dc:creator>ioriy2k</dc:creator>
				<category><![CDATA[Development Tools]]></category>
		<category><![CDATA[Linux, Just For Fun]]></category>
		<category><![CDATA[Leak]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Memory]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Valgrind]]></category>

		<guid isPermaLink="false">http://ioriy2k.pe.kr/?p=3754</guid>
		<description><![CDATA[Windows에서 개발을 한 경험이 있는 분들이라면, AQTime(예전 이름은 Memproof)이라는 상용 Tool을 잘 아실 것입니다. AQTime은 Runtime 검사를 통해서 Application의 Performance를 진단하고 Memory Leak(Heap Memory를 할당했을 경우 사용 후에 System에 반환하지 않아서 발생하는 누수현상)을 검사할 수 있는 유명한 Profiling Tool입니다. 이러한 Profiling Tool을 사용하면 개발자가 미처 파악하지 못한 Application의 문제를 해결하고 Performance를 향상시킬 수 있기 때문에 [...]]]></description>
			<content:encoded><![CDATA[<p>Windows에서 개발을 한 경험이 있는 분들이라면, AQTime(예전 이름은 Memproof)이라는 상용 Tool을 잘 아실 것입니다.</p>
<p><a href="http://smartbear.com/products/development-tools/performance-profiling/" target="_blank">AQTime</a>은 Runtime 검사를 통해서 Application의 Performance를 진단하고 Memory Leak(Heap Memory를 할당했을 경우 사용 후에 System에 반환하지 않아서 발생하는 누수현상)을 검사할 수 있는 유명한 Profiling Tool입니다.</p>
<p>이러한 Profiling Tool을 사용하면 개발자가 미처 파악하지 못한 Application의 문제를 해결하고 Performance를 향상시킬 수 있기 때문에 Project의 안정화 시에 주로 사용됩니다. </p>
<p>이번 Post에서는 이와 비슷한 기능을 Linux에서 수행하는 Command-line Tool인 Valgrind를 통해서 Memory Leak을 검사하는 방법을 알아보도록 하겠습니다.</p>

<h3>1. Valgrind?</h3>
<p>Valgrind는 앞서 말한 대로 Linux Program의 Profiling을 위한 Application입니다. (지원하는 Platform과 Architecture를 확인하려면 <a href="http://valgrind.org/info/platforms.html" target="_blank">여기</a>를 방문하면 됩니다.) 그리고 License가 GPL이기 때문에 AQTime과 달리 사용하는데 전혀 비용이 들지 않습니다. </p>
<p><span id="more-3754"></span></p>
<p>또한 <a href="http://valgrind.org/gallery/" target="_blank">수많은 Open-source Project</a>가 Valgrind를 통해서 Debugging과 Profiling을 수행하고 있다는 것은 이 Program의 정확성과 안정성을 증명합니다.</p>
<p>Valgrind는 엄밀하게 말하면 Profiling Suite로 여러가지 Profiling을 위한 도구를 포함하고 있으며 각각의 도구는 valgrind 명령을 통해 통합되어 수행됩니다. 그 중 일부를 소개하면 다음과 같습니다.</p>
<ul>
<li>Memcheck: Memory 관리의 문제를 진단하는 Tool입니다. 할당받지 않은 Heap Memory에 접근하는 것이나 Memory Leak과 같은 문제를 이 Tool을 통하여 발견할 수 있습니다.</li>
<li>Callgrind: Runtime 시에 각 함수의 호출 history와 실행 Function간의 Call Graph를 만들기 위한 정보를 기록하는데 사용하는 도구입니다. 저장된 내용은 Command-line Tool이나 KCachegrind를 통해서 분석할 수 있습니다. KCachegrind에 대해서는 이후에 간단한 사용법을 설명하겠습니다.</li>
<li>Massif: Heap Memory에 대한 사용 정보를 확인할 수 있습니다. 간단한 예제와 설명은 <a href="http://terascafe.tistory.com/19" target="_blank">여기</a>를 참고하기 바랍니다.</li>
<li>Helgrind: POSIX Thread(간단히 PThread)를 Program에서 사용할 때 각 Thread간의 동기화와 관련된 문제를 진단하기 위한 Tool입니다.</li>
</ul>
<p>Valgrind는 좋은 Tool이지만 사용할 때 유의할 점이 있습니다. Valgrind는 Code 상의 오류를 검사할 수 있지만, 문맥적인 오류는 잡아내지 못합니다. 다시 말하면, 기술적으로 해당 Program이 문제가 없다는 것을 증명할 수는 있지만, 실제 그 Program이 사용자가 원하는 대로 제대로 동작한다는 것을 증명할 수 없다는 것입니다. 생각 외로 이런 Profiling Tool을 과신하는 경우가 종종 있는데 그런 점은 조심해야 합니다.</p>
<p>좀 더 자세한 Valgrind의 정보를 얻기 원한다면 다음 Link를 방문하기 바랍니다.</p>
<ul>
<li>Valgrind&#8217;s Tool Suite: <a href="http://valgrind.org/info/tools.html" target="_blank">http://valgrind.org/info/tools.html</a></li>
<li>Valgrind User Manual: <a href="http://valgrind.org/docs/manual/manual.html" target="_blank">http://valgrind.org/docs/manual/manual.html</a></li>
</ul>
<h3>2. 설치</h3>
<p>Valgrind를 설치하는 것은 간단합니다. Terminal을 새로 열어서 다음과 같이 입력하여 설치합니다.</p>
<div class="codecolorer-container bash mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;"># </span><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get install</span> <span style="color: #c20cb9; font-weight: bold;">valgrind</span></div></td></tr></tbody></table></div>
<p>다음 Section에서는 Test Program을 Build하면서 설명을 진행합니다. System에 Build를 위한 Package가 설치되어있지 않다면 다음과 같이 입력하여 설치합니다.</p>
<div class="codecolorer-container bash mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">$ </span><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get install</span> build-essential</div></td></tr></tbody></table></div>
<h3>3. Memory Leak 검사하기</h3>
<p>Valgrind가 무엇인지에 대해서 알아봤고 설치도 마쳤으니, 이제 Test Program을 만들어서 Valgrind의 Memcheck 도구를 사용하여 Memory Leak을 검사하는 방법을 알아봅시다.</p>
<p>Gedit나 Vim과 같은 편집기를 사용해서 다음과 같은 내용을 입력한 후 test.c라고 저장합시다.</p>
<div class="codecolorer-container c mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br /></div></td><td><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #339933;">#include &lt;stdlib.h&gt;</span><br />
<br />
<span style="color: #993333;">void</span> test<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>c <span style="color: #339933;">=</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/malloc.html"><span style="color: #000066;">malloc</span></a><span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #0000dd;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; test<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>위의 C Code를 보면 test()에서 malloc()을 통해서 Heap Memory를 할당받았지만 사용 후에 free()를 사용하여 System에 반환하지 않았기 때문에 Memory Leak이 발생하는 것을 알 수 있습니다.</p>
<p>이제 이 Source를 Compile해 봅시다. Terminal에서 다음과 같이 입력하여 Debugging이 가능하도록 Option을 적용하여 Compile합니다.</p>
<div class="codecolorer-container bash mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">$ </span><span style="color: #c20cb9; font-weight: bold;">gcc</span> <span style="color: #660033;">-g</span> <span style="color: #660033;">-o</span> <span style="color: #7a0874; font-weight: bold;">test</span> test.c</div></td></tr></tbody></table></div>
<p>test.c를 Compile하여 생성된 test라는 실행 File에 대해서 이제 Valgrind를 사용하여 Memory Leak을 검사해 봅시다. Terminal에서 다음과 같이 입력하여 Valgrind를 실행합니다.</p>
<div class="codecolorer-container bash mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">$ </span><span style="color: #c20cb9; font-weight: bold;">valgrind</span> <span style="color: #660033;">--leak-check</span>=<span style="color: #c20cb9; font-weight: bold;">yes</span> .<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">test</span></div></td></tr></tbody></table></div>
<p>만약 Memory Leak을 검사할 Program이 Argument(명령행 인자)를 가지고 있다면, 위의 명령에서 검사할 Program 뒤에 그대로 이어서 적으면 됩니다.</p>
<p>위의 명령을 실행하면 먼저 test Program이 실행되고 종료된 후에 Valgrind가 검사한 정보가 Terminal에 출력됩니다.</p>
<div class="codecolorer-container text mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">==8067== Memcheck, a memory error detector<br />
==8067== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.<br />
==8067== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info<br />
==8067== Command: ./test<br />
==8067== <br />
==8067== <br />
==8067== HEAP SUMMARY:<br />
==8067== &nbsp; &nbsp; in use at exit: 10 bytes in 1 blocks<br />
==8067== &nbsp; total heap usage: 1 allocs, 0 frees, 10 bytes allocated<br />
==8067== <br />
==8067== 10 bytes in 1 blocks are definitely lost in loss record 1 of 1<br />
==8067== &nbsp; &nbsp;at 0x4C28FAC: malloc (vg_replace_malloc.c:236)<br />
==8067== &nbsp; &nbsp;by 0x400505: test (test.c:5)<br />
==8067== &nbsp; &nbsp;by 0x400514: main (test.c:10)<br />
==8067== <br />
==8067== LEAK SUMMARY:<br />
==8067== &nbsp; &nbsp;definitely lost: 10 bytes in 1 blocks<br />
==8067== &nbsp; &nbsp;indirectly lost: 0 bytes in 0 blocks<br />
==8067== &nbsp; &nbsp; &nbsp;possibly lost: 0 bytes in 0 blocks<br />
==8067== &nbsp; &nbsp;still reachable: 0 bytes in 0 blocks<br />
==8067== &nbsp; &nbsp; &nbsp; &nbsp; suppressed: 0 bytes in 0 blocks<br />
==8067== <br />
==8067== For counts of detected and suppressed errors, rerun with: -v<br />
==8067== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 4 from 4)</div></td></tr></tbody></table></div>
<p>위의 내용은 Valgrind를 실행하여 얻은 출력화면입니다. 중요한 부분은 11~14번째 Line에 있는 Memory Leak정보로, 이것은 test.c의 5번째 줄에 위치한 test()의 Code에서 Memory Leak이 발생했다는 것을 나타냅니다.</p>
<p>이와 같이 Memory Leak 정보에 표시된 Call Stack을 통해서 Source Code의 어느 함수의 몇번째 Line에서 Memory Leak이 발생했는지를 확인할 수 있습니다.</p>
<p>유의해야할 점은, Valgrind는 검사할 Program을 실행한 상태(Runtime)에서 검사하기 때문에 실행 시에 수행되지 않은 Code에 대해서는 검사할 수 없다는 것입니다. 그래서 Test Case를 잘 수행하지 않으면 Memory Leak을 검사하지 못할 수 있기 때문에 실행하기 전에 Test Case를 미리 준비하는 것이 좋습니다.</p>
<h3>4. 마치면서&#8230;</h3>
<p>지금까지 Valgrind를 사용하여 Memory Leak을 검사하는 방법을 간단하게 알아봤습니다. 다음 Post에서는 Valgrind의 Front-end를 사용하여 좀 더 쉽게 Memory Leak을 검사하는 방법과 Eclipse CDT로 Program을 개발했을 때 Eclipse 상에서 Valgrind를 사용하는 방법에 대해서 알아보도록 하겠습니다.</p>
  
<div class="wp_license">
<p><a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/2.0/kr/"><img src="http://i.creativecommons.org/l/by-nc-nd/2.0/kr/88x31.png" alt="Creative Commons Attribution-NonCommercial-NoDerivs 2.0 Korea" class="alignleft" style="margin-top:4px;" />
</a>This work  is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/2.0/kr/">Creative Commons Attribution-NonCommercial-NoDerivs 2.0 Korea</a>.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://ioriy2k.pe.kr/archives/3754/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Borland C++ Builder 6: Doxygen으로 Source Code 문서화하기 (Part 2)</title>
		<link>http://ioriy2k.pe.kr/archives/3385</link>
		<comments>http://ioriy2k.pe.kr/archives/3385#comments</comments>
		<pubDate>Mon, 24 Oct 2011 00:00:34 +0000</pubDate>
		<dc:creator>ioriy2k</dc:creator>
				<category><![CDATA[Borland C++ Builder]]></category>
		<category><![CDATA[Development Tools]]></category>
		<category><![CDATA[Borland]]></category>
		<category><![CDATA[Builder]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Doxygen]]></category>

		<guid isPermaLink="false">http://ioriy2k.pe.kr/?p=3385</guid>
		<description><![CDATA[이전 Post에 이어서 Borland C++ Builder 6로 작성한 Project를 문서화하기 위해서 Doxygen을 사용하는 방법에 대해 계속해서 알아보겠습니다. 이번 Post에서는 Doxygen의 GUI Configuration Tool인 Doxywizard를 사용하여 편리하게 HTML, CHM 문서를 생성하는 방법을 설명합니다. 4. Doxywizard로 HTML 문서 만들기 Doxygen은 Command-line Tool이기 때문에 Command Interpreter(cmd.exe)를 사용하여 명령행으로 실행해야 합니다. 그리고 Doxygen을 사용하기 위해서는 Doxygen이 문서를 생성하기 위한 [...]]]></description>
			<content:encoded><![CDATA[<p>이전 Post에 이어서 Borland C++ Builder 6로 작성한 Project를 문서화하기 위해서 Doxygen을 사용하는 방법에 대해 계속해서 알아보겠습니다.</p>
<p>이번 Post에서는 Doxygen의 GUI Configuration Tool인 Doxywizard를 사용하여 편리하게 HTML, CHM 문서를 생성하는 방법을 설명합니다.</p>

<h3>4. Doxywizard로 HTML 문서 만들기</h3>
<p>Doxygen은 Command-line Tool이기 때문에 Command Interpreter(cmd.exe)를 사용하여 명령행으로 실행해야 합니다. 그리고 Doxygen을 사용하기 위해서는 Doxygen이 문서를 생성하기 위한 Configuration File이 필요합니다.</p>
<p>그러나 Doxygen의 Front-end인 Doxywizard를 사용하면 쉽게 Configuration File 만들 수 있고, 문서도 또한 쉽게 생성할 수 있습니다.</p>
<p>이번에는 가장 기본적인 문서인 HTML 문서를 생성하기 위해 Doxywizard를 사용하여 설정하는 방법과 실제 문서를 생성하는 방법을 알아봅시다.</p>
<blockquote><p>
Doxygen의 수많은 설정 Option을 설명할 수는 없기 때문에 Doxywizard를 처음 실행한 Default Option에서 꼭 필요하거나 설정하면 편리한 Option만 간단하게 설명합니다. </p>
<p>자세한 Option과 설명이 필요하다면 Doxygen Manual의 <a href="http://www.stack.nl/~dimitri/doxygen/config.html" target="_blank">Reference Manual &#8211; Configuration Section</a>을 참고하기 바랍니다.
</p></blockquote>
<p><span id="more-3385"></span></p>
<div id="attachment_3266" class="wp-caption aligncenter" style="width: 268px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/03-Start-Menu-Doxywizard.png" rel="lightbox[3385]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/03-Start-Menu-Doxywizard-258x300.png" alt="Start Menu - Doxywizard" title="Start Menu - Doxywizard" width="258" height="300" class="size-medium wp-image-3266" /></a><p class="wp-caption-text">Start Menu - Doxywizard</p></div>
<p>Doxywizard를 실행하기 위해서 시작 -> 프로그램 -> doxygen -> Doxywizard를 Click합니다.</p>
<div id="attachment_3403" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/Doxywizard-Save.png" rel="lightbox[3385]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/Doxywizard-Save-300x233.png" alt="Doxywizard - Save" title="Doxywizard - Save" width="300" height="233" class="size-medium wp-image-3403" /></a><p class="wp-caption-text">Doxywizard - Save</p></div>
<p>Doxywizard가 위와 같이 실행되면 먼저 File -> Save를 Click하여 Doxygen Configuration을 저장할 File을 생성합니다. File의 위치는 Source Code Folder에서 문서 생성을 하위 Folder를 새로 만들어서 그 곳에 저장하는 것이 사용하기에 편리합니다.</p>
<p>Configuration File을 저장하면 Step 1에 Configuration File이 위치한 경로가 표시됩니다. 생성되는 HTML, CHM 문서는 이 곳에 생성됩니다. Configuration File에 Option 중 경로로를 입력해야 하는 Option이면 대부분 이 Folder에서 부터 상대경로(ex. ../Test)로 찾아가니 이점을 유의하기 바랍니다.</p>
<p>Step 2의 각 Tab에서는 설정을 관리하고 문서를 생성합니다. Wizard Tab으로 간단하게 설정할 수 있지만 Option이 너무 적기 때문에 Expert Tab에서 설정하는 것을 예로 들어 설명하겠습니다. (*로 표시한 것은 반드시 설정해야 합니다.)</p>
<h4>4.1 Project Section</h4>
<div id="attachment_3267" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/04-Doxywizard-Project.png" rel="lightbox[3385]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/04-Doxywizard-Project-300x233.png" alt="Doxywizard - Project" title="Doxywizard - Project" width="300" height="233" class="size-medium wp-image-3267" /></a><p class="wp-caption-text">Doxywizard - Project</p></div>
<p>Project Section에서는 문서화하려는 대상 Project와 관련된 Option을 설정할 수 있습니다. Default 상태에서 다음과 같은 Option을 설정합니다.</p>
<ul>
<li>PROJECT_NAME : Project의 이름을 입력합니다. Project 이름은 나중에 생성된 HTML 문서의 최상단에 위치하게 됩니다.</li>
<li>OUTPUT_LANGUAGE<sup>*</sup> : 생성된 문서에서 사용하는 문자열에 대한 언어를 설정합니다. <strong>Korean</strong>으로 설정하면 생성된 문서에서 Doxygen이 자동으로 입력하는 문자열이 모두 한국어로 표시됩니다.</li>
<li>TAB_SIZE : Source Code를 표시할 때 Tab 간격을 설정합니다. 각자 취향에 맞춰서 크기를 입력합니다.</li>
<li>BUILTIN_STL_SUPPORT : Source Code에 STL를 사용할 경우(ex. std::vector) STL의 Source가 Project 내에 존재하지 않더라도 스스로 판단하여 관계를 표시합니다. STL를 상속받아서 사용하거나 Data Structure로 사용한 경우에는 <strong>Check</strong>하는 편이 좋습니다.</li>
</ul>
<h4>4.2 Build Section</h4>
<div id="attachment_3268" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/05-Doxywizard-Build.png" rel="lightbox[3385]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/05-Doxywizard-Build-300x233.png" alt="Doxywizard - Build" title="Doxywizard - Build" width="300" height="233" class="size-medium wp-image-3268" /></a><p class="wp-caption-text">Doxywizard - Build</p></div>
<p>Build Section에서는 Source Code에서 문서화를 할 요소들을 선택할 수 있습니다. 다음과 같은 Option을 취향에 맞게 설정합니다.</p>
<ul>
<li>EXTRACT_ALL : 상당히 세밀하게 Source Code에서 각 요소들을 분별하여 문서를 생성합니다. Private Class나 Static Member를 제외한 대부분의 요소에 대한 정보를 포함합니다. Source Code에 대한 자세한 정보를 얻기 위한다면 Check합니다.</li>
<li>EXTRACT_PRIVATE : Check할 경우 Class의 Private Member도 문서에 포함됩니다. </li>
<li>EXTRACT_STATIC : Check할 경우 Static Membr도 문서에 포함됩니다.</li>
<li>SHOW_DIRECTORIES : Source가 여러 Folder로 되어있고 그 Folder들이 문서 생성을 위한 대상 Folder일 경우, Check하면 Folder의 구조를 생성된 문서에서 확인할 수 있습니다.</li>
</ul>
<h4>4.3 Input Section</h4>
<div id="attachment_3309" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/Doxywizard-Input-Section.png" rel="lightbox[3385]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/Doxywizard-Input-Section-300x233.png" alt="Doxywizard - Input" title="Doxywizard - Input" width="300" height="233" class="size-medium wp-image-3309" /></a><p class="wp-caption-text">Doxywizard - Input</p></div>
<p>Input Section은 Doxygen으로 문서를 생성할 Source Code의 위치를 지정하고 그와 관련된 Option을 설정합니다.</p>
<ul>
<li>INPUT<sup>*</sup> : Doxygen으로 문서를 생성할 대상 Folder를 지정합니다. 위의 그림과 같이 오른쪽에 있는 각 Button을 통해서 개별 File이나 Directory를 추가할 수 있습니다. 추가되는 경로는 위의 Step1에 설정된 경로를 기준으로 상대경로로 입력됩니다. 물론 절대경로로도 입력할 수 있으나 추천하지는 않습니다.</li>
<li>INPUT_ENCODING<sup>*</sup> : Doxygen이 문서를 생성하기 위해 Source Code Parsing을 하기 위해서 Source Code에 대한 Encoding을 지정합니다. Borland C++ Builder 6로 생성한 Source에 한글이 들어가 있다면 <strong>CP949</strong>를 입력합니다.</li>
<li>RECURSIVE<sup>*</sup> : 위에 INPUT에 설정한 Folder의 하위 Folder가 존재하고 그 Folder에 Source Code가 존재한다면 <strong>Check</strong>하여 모두 검색하도록 합니다. Uncheck일 경우 하위 Folder를 검색하지 않습니다.</li>
</ul>
<h4>4.4 Source Browser Section</h4>
<div id="attachment_3270" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/07-Doxywizard-Source-Browser.png" rel="lightbox[3385]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/07-Doxywizard-Source-Browser-300x233.png" alt="Doxywizard - Source Browser" title="Doxywizard - Source Browser" width="300" height="233" class="size-medium wp-image-3270" /></a><p class="wp-caption-text">Doxywizard - Source Browser</p></div>
<p>Source Browser Section에서는 생성할 문서에 Source Code의 내용을 포함시키는 것과 관련된 Option을 설정할 수 있습니다.</p>
<ul>
<li>SOURCE_BROWSER : Check할 경우 생성할 문서에 Source Code의 Header 뿐만 아니라 Source의 내용이 추가되어 저장됩니다.</li>
<li>INLINE_SOURCES : Check할 경우 생성할 문서에 각 Method나 Enum Type에 대한 설명 바로 밑에 해당 Code가 바로 표시됩니다.</li>
</ul>
<h4>4.5 HTML Section</h4>
<div id="attachment_3308" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/Doxywizard-HTML-Section.png" rel="lightbox[3385]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/Doxywizard-HTML-Section-300x233.png" alt="Doxywizard - HTML" title="Doxywizard - HTML" width="300" height="233" class="size-medium wp-image-3308" /></a><p class="wp-caption-text">Doxywizard - HTML</p></div>
<p>HTML 문서를 생성하기 위한 Option을 설정하는 Section입니다. Default 설정이 HTML 문서를 생성하게 되어있기 때문에 별로 수정할 것은 없으나 아래의 Option을 설정하면 편리합니다.</p>
<ul>
<li>GENERATE_TREEVIEW : Check할 경우 CHM 문서와 같이 생성된 HTML문서의 왼쪽 Frame의 전체 문서의 구조가 Treeview 형태로 표시됩니다.</li>
</ul>
<h4>4.6 LaTeX Section</h4>
<div id="attachment_3272" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/09-Doxywizard-LaTeX.png" rel="lightbox[3385]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/09-Doxywizard-LaTeX-300x233.png" alt="Doxywizard - LaTeX" title="Doxywizard - LaTeX" width="300" height="233" class="size-medium wp-image-3272" /></a><p class="wp-caption-text">Doxywizard - LaTeX</p></div>
<p>LaTeX는 문서 조판 System으로서 역사가 깊은 Program입니다. LaTex을 사용하면(System에 LaTeX이 설치되어 있는 경우) Source Code에 대한 PDF문서를 생성할 수 있지만, 여기서는 HTML문서를 생성할 것이므로 다음과 같이 설정합니다.</p>
<ul>
<li>GENERATE_LATEX<sup>*</sup> : <strong>Uncheck</strong>하면 LaTeX 문서를 생성하지 않습니다.</li>
</ul>
<h4>4.7 Dot Section</h4>
<div id="attachment_3273" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/10-Doxywizard-Dot.png" rel="lightbox[3385]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/10-Doxywizard-Dot-300x233.png" alt="Doxywizard - Dot" title="Doxywizard - Dot" width="300" height="233" class="size-medium wp-image-3273" /></a><p class="wp-caption-text">Doxywizard - Dot</p></div>
<p>Dot Section에서는 Graphviz Package의 Program 중 하나인 Dot을 사용하여 Class Diagram이나 호출 관계도 등을 그리는 것에 대한 Option을 설정할 수 있습니다.</p>
<ul>
<li>HAVE_DOT<sup>*</sup> : Dot이 System에 설치되어 있는지를 나타내는 Option입니다. 이전 Post에서 Graphviz를 설치했기 때문에 <strong>Check</strong>합니다.</li>
<li>UML_LOOK<sup>*</sup> : <strong>Check</strong>할 경우 Class의 상속 Diagram과 협업 Diagram을 UML에서 정의한 Style로 그립니다.</li>
</ul>
<p>위와 같이 Option을 설정할 경우 Class의 상속 Diagram과 협업 Diagram이 아래와 같이 표시됩니다.</p>
<div id="attachment_3370" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/HTML-Class-Diagram.png" rel="lightbox[3385]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/HTML-Class-Diagram-300x180.png" alt="HTML - Class Diagram" title="HTML - Class Diagram" width="300" height="180" class="size-medium wp-image-3370" /></a><p class="wp-caption-text">HTML - Class Diagram</p></div>
<h4>4.8 Run</h4>
<div id="attachment_3301" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/Doxywizard-Run-Tab.png" rel="lightbox[3385]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/Doxywizard-Run-Tab-300x233.png" alt="Doxywizard - Run Tab" title="Doxywizard - Run Tab" width="300" height="233" class="size-medium wp-image-3301" /></a><p class="wp-caption-text">Doxywizard - Run Tab</p></div>
<p>이제 설정이 완료되었습니다. File -> Save를 Click하여 변경한 내용을 저장하고 Run Tab에서 Run doxygen Button을 Click하면 HTML문서를 생성합니다.</p>
<p>특별한 Error가 없다면 &quot;Doxygen has finished&quot;라는 Message가 표시될 것입니다. 문제가 생겼다면 설정을 다시 한번 확인해보기 바랍니다. Input Section의 INPUT Option에서 Source Code의 경로가 잘못되어 있는 것이 아니라면 대부분 제대로 생성될 것입니다.</p>
<p>생성된 HTML문서를 확인하기 위해서 아래의 Show HTML output Button을 Click하면 System의 기본 Browser를 통해서 생성된 HTML 문서를 확인할 수 있습니다. (생성된 문서는 Step1에 설정한 경로\html\index.html을 열어서 확인할 수도 있습니다.)</p>
<h3>5. Doxywizard로 CHM 문서 만들기</h3>
<p>Doxygen으로 생성한 HTML 문서는 여러 HTML과 CSS, Image 등으로 구성되어 있기 때문에 문서를 보관하거나 이동해서 가지고 다니는 용도로는 조금 부적합합니다.</p>
<p>Doxygen으로 생성할 수 있는 여러 문서 Type 중에서 CHM 문서를 생성하면, 하나의 File로 문서를 보관할 수 있고 또한 문서 내용을 검색할 수 있으며 굳이 문서를 읽기 위해 Viewer를 설치할 필요가 없이 Windows 환경에서 바로 열람이 가능합니다.</p>
<p>이번에는 Doxywizard를 사용해서 Source Code에 대한 CHM 문서를 만들어 봅시다.</p>
<h4>5.1 HTML Help Workshop 설치</h4>
<p>CHM은 Windows의 도움말 File(Microsoft Compiled HTML Help)의 확장자로 실제로는 HTML을 압축한 형태를 띠고 있습니다. 이 CHM 문서를 생성하기 위해서는 MS에서 제공하는 HTML Help Workshop이라는 Program을 설치해야 합니다.</p>
<div id="attachment_3285" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/06-HTML-Help-Workshop-Download.png" rel="lightbox[3385]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/06-HTML-Help-Workshop-Download-300x187.png" alt="HTML Help Workshop Download" title="HTML Help Workshop Download" width="300" height="187" class="size-medium wp-image-3285" /></a><p class="wp-caption-text">HTML Help Workshop Download</p></div>
<p>HTML Help Workshop은 MS에서 무료로 배포하고 있으므로 <a href="http://www.microsoft.com/download/en/details.aspx?id=21138" target="_blank">HTML Help Workshop Page</a>에 들어가서 위의 그림과 같이 htmlhelp.exe를 Download한 후 설치합니다.</p>
<h4>5.2 Doxywizard 설정 (HTML Section)</h4>
<div id="attachment_3271" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/08-Doxywizard-HTML.png" rel="lightbox[3385]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/08-Doxywizard-HTML-300x233.png" alt="Doxywizard - HTML" title="Doxywizard - HTML" width="300" height="233" class="size-medium wp-image-3271" /></a><p class="wp-caption-text">Doxywizard - HTML</p></div>
<p>CHM을 생성할 때의 Doxywizard의 설정은 위의 HTML 문서를 생성할 때와 동일합니다. 다만 HTML Section에서 아래와 같은 Option을 더 설정해야 합니다.</p>
<ul>
<li>GENERATE_HTMLHELP<sup>*</sup>: <strong>Check</strong>하면 CHM 문서를 생성합니다.</li>
<li>CHM_FILE<sup>*</sup>: CHM File이 저장되는 경로와 File명을 지정합니다. 유의할 것은 다른 설정과 달리 여기의 기본 Folder는 &#8220;Step1에서 지정한 Folder\html&#8221;입니다.</li>
<li>HHC_LOCATION<sup>*</sup>: HTML Help Workshop에서 CHM을 생성하는 Console Program인 hhc.exe의 경로를 지정합니다. 경로는 다음과 같습니다.<br />
32bit OS &#8211; C:\Program Files\HTML Help Workshop\hhc.exe<br />
64bit OS &#8211; C:\Program Files (x86)\HTML Help Workshop\hhc.exe</li>
<li>CHM_INDEX_ENCODING<sup>*</sup>: CHM 문서의 Index Encoding을 지정합니다. 한글이 사용된 경우 <strong>CP949</strong>를 입력합니다.</li>
</ul>
<blockquote><p>GENERATE_HTMLHELP를 Check하여 CHM 문서를 생성할 경우, HTML 문서의 왼쪽 Frame에 Treeview를 만들어 주는 GENERATE_TREEVIEW Option은 동작하지 않습니다.</p></blockquote>
<h4>5.3 Run</h4>
<div id="attachment_3274" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/11-Doxywizard-Run.png" rel="lightbox[3385]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/11-Doxywizard-Run-300x233.png" alt="Doxywizard - Run" title="Doxywizard - Run" width="300" height="233" class="size-medium wp-image-3274" /></a><p class="wp-caption-text">Doxywizard - Run</p></div>
<p>File -> Save로 설정을 저장한 다음, Run Tab에서 Run doxygen Button을 Click하면 CHM 문서가 생성됩니다. 위의 그림에 &#8220;Running html help compiler&#8221;라는 Text를 통해서 CHM 문서가 생성된다는 것을 확인할 수 있습니다.</p>
<div id="attachment_3368" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/CHM-Mainpage.png" rel="lightbox[3385]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/CHM-Mainpage-300x180.png" alt="CHM - Mainpage" title="CHM - Mainpage" width="300" height="180" class="size-medium wp-image-3368" /></a><p class="wp-caption-text">CHM - Mainpage</p></div>
<p>만들어진 CHM 문서는 CHM_FILE Option에 설정한 경로에 해당 이름으로 생성됩니다. Double-click해서 문서를 열면 위와 같은 모습이 될 것입니다.</p>
<h3>6. 마치면서&#8230;</h3>
<p>이상으로 Doxygen을 사용하여 Borland C++ Builder 6로 구현한 Project를 문서화하는 방법을 알아봤습니다. </p>
<p>Project를 수행하는 것은 각자 개개인의 Programming 실력을 요구하지만, 또한 그것과 더불어 개발자 간의 Communication이 필요합니다. Doxygen을 이용한 문서화를 통해서 Project 구현에 대한 개발자 간의 Communication이 더 증진되기 바랍니다.</p>
  
<div class="wp_license">
<p><a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/2.0/kr/"><img src="http://i.creativecommons.org/l/by-nc-nd/2.0/kr/88x31.png" alt="Creative Commons Attribution-NonCommercial-NoDerivs 2.0 Korea" class="alignleft" style="margin-top:4px;" />
</a>This work  is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/2.0/kr/">Creative Commons Attribution-NonCommercial-NoDerivs 2.0 Korea</a>.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://ioriy2k.pe.kr/archives/3385/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Borland C++ Builder 6: Doxygen으로 Source Code 문서화하기 (Part 1)</title>
		<link>http://ioriy2k.pe.kr/archives/3259</link>
		<comments>http://ioriy2k.pe.kr/archives/3259#comments</comments>
		<pubDate>Wed, 19 Oct 2011 00:00:56 +0000</pubDate>
		<dc:creator>ioriy2k</dc:creator>
				<category><![CDATA[Borland C++ Builder]]></category>
		<category><![CDATA[Development Tools]]></category>
		<category><![CDATA[Borland]]></category>
		<category><![CDATA[Builder]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Doxygen]]></category>

		<guid isPermaLink="false">http://ioriy2k.pe.kr/?p=3259</guid>
		<description><![CDATA[Doxygen은 여러 Programming Language를 위한 문서화 도구입니다. Source Code를 문서화한다는 것은 Code내의 주석을 통하여 Code의 구조와 Interface를 문서로 만드는 것을 의미합니다. Doxygen을 사용하면 C++, C, C#, Fortran, Java, Objective-C, PHP, Python 등의 언어를 사용한 Source Code에 Doxygen에서 정의한 Style로 주석을 작성하면 자동으로 문서를 생성할 수 있게 됩니다. 생성된 문서는 마치 MSDN이나 기타 Live API Document와 [...]]]></description>
			<content:encoded><![CDATA[<p>Doxygen은 여러 Programming Language를 위한 문서화 도구입니다. Source Code를 문서화한다는 것은 Code내의 주석을 통하여 Code의 구조와 Interface를 문서로 만드는 것을 의미합니다.</p>
<p>Doxygen을 사용하면 C++, C, C#, Fortran, Java, Objective-C, PHP, Python 등의 언어를 사용한 Source Code에 Doxygen에서 정의한 Style로 주석을 작성하면 자동으로 문서를 생성할 수 있게 됩니다.</p>
<p>생성된 문서는 마치 MSDN이나 기타 Live API Document와 같은 형식으로 Web Browser, PDF Reader, CHM Help 등으로 열람이 가능합니다. 이것은 여럿이 동시에 작업하는 Project에 더욱 유용합니다.</p>
<p>이번 Post에서는 Borland C++ Builder 6로 작성한 Project를 Doxygen을 사용하여 문서화하는 방법을 다루도록 하겠습니다.</p>

<h3>1. Doxygen 설치</h3>
<p>Doxygen 자체는 Source Code의 주석을 사용하여 문서를 자동으로 생성하는 도구로서 IDE와 통합되어 동작하지 않습니다. 다만 Doxygen에서 정의한 Style에 주석을 Project 개발시에 Source Code에 작성하면 됩니다. (Java, Flex의 경우에는 문서화 도구인 JavaDoc, ASDoc Style로 작성한 주석을 바로 Parsing하여 Eclipse에서 해당 Class나 Method에 대한 주석을 바로 확인할 수 있습니다.)</p>
<p><span id="more-3259"></span></p>
<p>또한 Doxygen은 Cross-Platform Tool로서 Windows, Mac OS X, Linux (or Unix-like OS)에서 사용이 가능합니다. 이것은 Windows Application의 Source Code를 Doxygen에서 지정한 형식으로 주석을 작성해 놓으면, Web Server가 동작하는 다른 OS에서 Doxygen을 사용하여 Source Code 문서를 생성할 수 있다는 것을 말합니다. 한마디로 해당 Project에 대한 API Web Service(like MSDN)를 운영할 수 있게 됩니다.</p>
<p>이제 어느정도 설명이 끝났으니 설치를 해보도록 합시다. <a href="http://doxygen.org" target="_blank">Doxygen의 Homepage</a>에 접속합니다.</p>
<div id="attachment_3280" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/01-Doxygen-Site.png" rel="lightbox[3259]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/01-Doxygen-Site-300x187.png" alt="Doxygen Site" title="Doxygen Site" width="300" height="187" class="size-medium wp-image-3280" /></a><p class="wp-caption-text">Doxygen Site</p></div>
<p>Program을 Download하기 위해서 오른쪽의 Download를 Click합니다.</p>
<div id="attachment_3281" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/02-Doxygen-Download.png" rel="lightbox[3259]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/02-Doxygen-Download-300x187.png" alt="Doxygen Download" title="Doxygen Download" width="300" height="187" class="size-medium wp-image-3281" /></a><p class="wp-caption-text">Doxygen Download</p></div>
<p>여러 OS에 대한 Binary가 존재하는데 여기에서는 32-bit binary distribution for Windows XP/Vista/7 Section의 설치 File을 Download합니다.</p>
<div id="attachment_3264" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/01-Doxygen-Install.png" rel="lightbox[3259]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/01-Doxygen-Install-300x231.png" alt="Doxygen Install" title="Doxygen Install" width="300" height="231" class="size-medium wp-image-3264" /></a><p class="wp-caption-text">Doxygen Install</p></div>
<p>Download한 설치 File을 설치합니다. 설치 중간에 위와 같이 Doxygen 구성요소가 나오는데 여기에서 Doxywizard GUI를 선택합니다. </p>
<p>Doxywizard를 사용하면 Command-line 기반의 Doxygen을 좀 더 편리하게 쓸 수 있습니다.</p>
<div id="attachment_3282" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/03-Graphviz-Site.png" rel="lightbox[3259]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/03-Graphviz-Site-300x187.png" alt="Graphviz Site" title="Graphviz Site" width="300" height="187" class="size-medium wp-image-3282" /></a><p class="wp-caption-text">Graphviz Site</p></div>
<p>그리고 한 가지 더 설치해야 할 Tool이 있습니다. Doxygen은 문서를 생성할 때 Class나 Method의 관계를 나타내기 위해서 Graphviz라는 Tool을 사용합니다. 이번에는 Graphviz를 설치하도록 합시다.</p>
<p><a href="http://www.graphviz.org" target="_blank">Graphviz의 Homepage</a>에서 왼쪽 Download를 Click합니다.</p>
<div id="attachment_3283" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/04-Graphiviz-License-Agreement.png" rel="lightbox[3259]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/04-Graphiviz-License-Agreement-300x187.png" alt="Graphiviz License Agreement" title="Graphiviz License Agreement" width="300" height="187" class="size-medium wp-image-3283" /></a><p class="wp-caption-text">Graphiviz License Agreement</p></div>
<p>License 동의를 위해서 맨 아래쪽의 Agree를 Click합니다.</p>
<div id="attachment_3284" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/05-Graphviz-Download.png" rel="lightbox[3259]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/05-Graphviz-Download-300x187.png" alt="Graphviz Download" title="Graphviz Download" width="300" height="187" class="size-medium wp-image-3284" /></a><p class="wp-caption-text">Graphviz Download</p></div>
<p>Windows &#8211; Stable and Development Windows Install Packages를 Click하여 Download한 후 설치하면 모든 준비는 완료됩니다.</p>
<h3>2. Source Code에 문서화를 위한 Comment 작성</h3>
<div id="attachment_3367" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/BCB6-Doxygen-Test-Project.png" rel="lightbox[3259]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/BCB6-Doxygen-Test-Project-300x187.png" alt="BCB6 - Doxygen Test Project" title="BCB6 - Doxygen Test Project" width="300" height="187" class="size-medium wp-image-3367" /></a><p class="wp-caption-text">BCB6 - Doxygen Test Project</p></div>
<p>설치가 모두 끝났으니 이제 Source Code에 Doxygen Style의 주석을 달아봅시다. Style 및 사용하는 Metatag는 여러가지가 있는데 여기서는 간단하게 주로 사용하는 것을 Template 형태로 적어보도록 하겠습니다.</p>
<p>좀 더 자세한 내용을 알기 원한다면 아래의 Doxygen Manual을 참조하기 바랍니다.</p>
<ul>
<li>Online Manual : <a href="http://www.stack.nl/~dimitri/doxygen/download.html#latestman" target="_blank">http://www.stack.nl/~dimitri/doxygen/download.html#latestman</a></li>
<li>설치된 Manual : C:\Program Files\doxygen\html\index.html<br />
(64bit OS일 경우에는 C:\Program Files (x86)\doxygen\html\index.html)</li>
</ul>
<h4>2.1 Class comment template</h4>
<p>Class에 대한 주석을 작성할 때는 아래와 같이 작성하면 됩니다. 아래의 예제에서는 Class에 대한 주석 뿐만 아니라, 전역 변수, Method에 대한 주석도 설명하고 있습니다.</p>
<div class="codecolorer-container cpp mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br /></div></td><td><div class="cpp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff0000; font-style: italic;">/**<br />
&nbsp;* 짧은 Class 설명<br />
&nbsp;*<br />
&nbsp;* @author &nbsp;ioriy2k &lt;ioriy2k@ioriy2k.pe.kr&gt;<br />
&nbsp;*<br />
&nbsp;* 긴 Class 설명을 여기에 적습니다.<br />
&nbsp;*/</span><br />
<span style="color: #0000ff;">class</span> Test <span style="color: #008000;">&#123;</span><br />
<br />
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span><br />
<br />
&nbsp; &nbsp; <span style="color: #666666;">/// 전역변수에 대한 한 줄 설명</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">bool</span> test_flag<span style="color: #008080;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff0000; font-style: italic;">/**<br />
&nbsp; &nbsp; &nbsp;* 전역변수에 대한 긴 설명을 작성할 수 있습니다.<br />
&nbsp; &nbsp; &nbsp;* 여러 줄로 표현이 가능합니다.<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">bool</span> test_flag1<span style="color: #008080;">;</span><br />
<br />
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span><br />
<br />
&nbsp; &nbsp; <span style="color: #666666;">/// Method에 대한 한 줄 설명 &nbsp; &nbsp;</span><br />
&nbsp; &nbsp; Test<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></div></td></tr></tbody></table></div>
<p>위와 같은 주석을 작성한 후, Doxygen으로 문서를 생성한 모습은 다음과 같습니다.</p>
<div id="attachment_3378" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/HTML_Class_Description.png" rel="lightbox[3259]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/HTML_Class_Description-300x180.png" alt="HTML - Class Description" title="HTML - Class Description" width="300" height="180" class="size-medium wp-image-3378" /></a><p class="wp-caption-text">HTML - Class Description</p></div>
<h4>2.2 Method comment template</h4>
<p>Class의 Metho에 대한 주석을 작성할 때는 다음과 같이 작성하면 됩니다.</p>
<div class="codecolorer-container cpp mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td><div class="cpp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff0000; font-style: italic;">/**<br />
&nbsp;* 짧은 Method 주석<br />
&nbsp;*<br />
&nbsp;* 긴 Method 주석을 여기에 작성합니다.<br />
&nbsp;*<br />
&nbsp;* @param &nbsp; &nbsp;run &nbsp; &nbsp;Parameter명을 먼저 적고 그 이후에 변수에 대한 정보를 적습니다.<br />
&nbsp;* @return return 값이 존재하는 경우 Return 값에 대한 정보를 적습니다.<br />
&nbsp;*/</span><br />
<span style="color: #0000ff;">bool</span> Test<span style="color: #008080;">::</span><span style="color: #007788;">RunTest</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> run<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><br />
<br />
<span style="color: #008000;">&#125;</span></div></td></tr></tbody></table></div>
<p>Parameter가 여러 개일 경우에는 Parameter의 순서대로 @param을 사용하여 설명을 적습니다. 개인적으로는 Debugging을 하기 위해서 header를 반복해서 살펴야 하는 Case를 가능하면 피하기 위해서 Method 주석은 header보다는 cpp에 적는 편입니다.</p>
<p>위와 같이 작성한 주석을 가지고 Doxygen으로 문서를 생성한 모습은 다음과 같습니다.</p>
<div id="attachment_3372" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/HTML-Method-Description.png" rel="lightbox[3259]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/HTML-Method-Description-300x180.png" alt="HTML - Method Description" title="HTML - Method Description" width="300" height="180" class="size-medium wp-image-3372" /></a><p class="wp-caption-text">HTML - Method Description</p></div>
<h4>2.3 Mainpage comment template</h4>
<p>Mainpage는 Doxygen 문서의 Mainpage(index.html)를 주석으로 생성하는 것을 의미합니다. Mainpage 주석은 Source에 오직 한 군데만 작성해야 하며 이 곳은 주로 Project의 개관, 알아두어야 할 정보나 Compile 방법 등을 적어 놓는데 사용합니다.</p>
<div class="codecolorer-container cpp mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br /></div></td><td><div class="cpp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff0000; font-style: italic;">/**<br />
&nbsp;* @mainpage Project 제목<br />
&nbsp;*<br />
&nbsp;* @section overview Overview<br />
&nbsp;*<br />
&nbsp;* Section에 대한 설명을 여기에 적습니다.<br />
&nbsp;*<br />
&nbsp;* @section list List<br />
&nbsp;*<br />
&nbsp;* 다음과 같이 순서가 없는 List를 작성할 수 있습니다.<br />
&nbsp;*<br />
&nbsp;* - List 1<br />
&nbsp;* - List 2<br />
&nbsp;* <br />
&nbsp;* 다음과 같이 순서가 있는 List를 작성할 수 있습니다.<br />
&nbsp;*<br />
&nbsp;* -# List 1<br />
&nbsp;* -# List 2<br />
&nbsp;*/</span></div></td></tr></tbody></table></div>
<p>위와 같은 Mainpage Comment를 Doxygen으로 문서화하면 다음과 같은 모습이 됩니다.</p>
<div id="attachment_3371" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/HTML-Mainpage.png" rel="lightbox[3259]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/10/HTML-Mainpage-300x180.png" alt="HTML - Mainpage" title="HTML - Mainpage" width="300" height="180" class="size-medium wp-image-3371" /></a><p class="wp-caption-text">HTML - Mainpage</p></div>
<h3>3. 마치면서&#8230;</h3>
<p>이상으로 Doxygen을 설치하는 방법과 문서 생성을 위해 Source Code에 주석을 다는 방법을 알아봤습니다. 다음 Post에서는 Source Code에 작성한 주석을 Doxywizard를 사용해서 HTML과 CHM 문서로 만드는 방법을 알아보도록 하겠습니다.</p>
  
<div class="wp_license">
<p><a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/2.0/kr/"><img src="http://i.creativecommons.org/l/by-nc-nd/2.0/kr/88x31.png" alt="Creative Commons Attribution-NonCommercial-NoDerivs 2.0 Korea" class="alignleft" style="margin-top:4px;" />
</a>This work  is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/2.0/kr/">Creative Commons Attribution-NonCommercial-NoDerivs 2.0 Korea</a>.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://ioriy2k.pe.kr/archives/3259/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nautilus에서 Source Code를 Subversion으로 관리하자 : RabbitVCS (Part 3)</title>
		<link>http://ioriy2k.pe.kr/archives/3179</link>
		<comments>http://ioriy2k.pe.kr/archives/3179#comments</comments>
		<pubDate>Wed, 14 Sep 2011 00:00:35 +0000</pubDate>
		<dc:creator>ioriy2k</dc:creator>
				<category><![CDATA[Development Tools]]></category>
		<category><![CDATA[Linux, Just For Fun]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[SVN]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Version Control]]></category>

		<guid isPermaLink="false">http://ioriy2k.pe.kr/?p=3179</guid>
		<description><![CDATA[Ubuntu Oneiric Ocelot 11.10에서 Test 완료 (2012-01-05) &#8220;Nautilus에서 Source Code를 Subversion으로 관리하자 : RabbitVCS&#8221;의 마지막 Post로 이전 Part 1, Part 2에 이어서 Branch/Tag, Merge에 대해서 설명하도록 하겠습니다. 예제를 가지고 설명하기 때문에 이전 Post를 간단하게 읽어보기를 권합니다. 14. Branch/Tag Project를 진행하다가 새로운 기능을 추가하기 위해서 Test를 위한 Project를 만들어야 할 때가 있습니다. Pilot Project로 Test하는 경우도 [...]]]></description>
			<content:encoded><![CDATA[<blockquote>
<ul>
<li>Ubuntu Oneiric Ocelot 11.10에서 Test 완료 (2012-01-05)</li>
</ul>
</blockquote>
<p>&#8220;Nautilus에서 Source Code를 Subversion으로 관리하자 : RabbitVCS&#8221;의 마지막 Post로 이전 <a href="http://ioriy2k.pe.kr/archives/2628" title="Nautilus에서 Source Code를 Subversion으로 관리하자 : RabbitVCS (Part 1)" target="_blank">Part 1</a>, <a href="http://ioriy2k.pe.kr/archives/2899" title="Nautilus에서 Source Code를 Subversion으로 관리하자 : RabbitVCS (Part 2)" target="_blank">Part 2</a>에 이어서 Branch/Tag, Merge에 대해서 설명하도록 하겠습니다. 예제를 가지고 설명하기 때문에 이전 Post를 간단하게 읽어보기를 권합니다. <img src='http://ioriy2k.pe.kr/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<h3>14. Branch/Tag</h3>
<p>Project를 진행하다가 새로운 기능을 추가하기 위해서 Test를 위한 Project를 만들어야 할 때가 있습니다. Pilot Project로 Test하는 경우도 있지만 현재 Project Source를 가지고 Test하면서 그 Code를 Subversion으로 관리하는 경우가 대부분일 것입니다.</p>
<p>이럴 때 사용하는 것이 Branch라는 기능입니다. Branch는 사실 기능이 아니라 개념으로써, 설명한 것과 같이 Project의 새 기능 추가 Test 등의 이유로 현재 Project 저장소에 있는 Code를 그대로 복제하여 새로운 곁가지 Project를 만드는 것을 의미합니다.</p>
<p>Branch Project를 통해서 새 기능을 추가하거나 Test한다고 하더라도 Trunk에 존재하는 최신 Source에 대해서는 영향이 미치지 않으며 나중에 Branch에 있는 Code를 Trunk에 통합할 수도 있습니다.</p>
<p>Hello Project의 Branch를 만들어 보면서 그 기능을 간단히 알아봅시다.</p>
<p><span id="more-3179"></span></p>
<div id="attachment_3149" class="wp-caption aligncenter" style="width: 294px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/08/14-RabbitVCS-Branche.png" rel="lightbox[3179]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/08/14-RabbitVCS-Branche-284x300.png" alt="RabbitVCS - Branch" title="RabbitVCS - Branch" width="284" height="300" class="size-medium wp-image-3149" /></a><p class="wp-caption-text">RabbitVCS - Branch</p></div>
<p>Hello Project Folder 내의 Branches Folder에서 Mouse 오른쪽 Button Popup을 띄운 후, RabbitVCS -> Branch/Tag를 Click합니다.</p>
<div id="attachment_3150" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/08/15-BrancheAndTag-Dialog.png" rel="lightbox[3179]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/08/15-BrancheAndTag-Dialog-300x240.png" alt="Branch/Tag Dialog" title="Branch/Tag Dialog" width="300" height="240" class="size-medium wp-image-3150" /></a><p class="wp-caption-text">Branch/Tag Dialog</p></div>
<p>Branch/Tag Dialog에서는 다음과 같은 내용을 설정할 수 있습니다. (위의 그림은 Hello Project의 trunk를 branches/hello-dev로 Branch 하는 경우를 나타냄)</p>
<ul>
<li>Repository : From &#8211; Source를 가져올 Project 저장소를 나타냅니다. To &#8211; 가져온 Source를 저장할 Directory를 설정합니다.</li>
<li>Create copy from : Source를 Project 저장소에서 가져올 때 어느 Source를 가져올 지를 결정하는 것으로 HEAD를 선택하면 최신을, Number를 선택하면 원하는 Revision을 가져올 수 있습니다.</li>
<li>Add message : Branch에 대한 Log Message를 입력합니다.</li>
</ul>
<div id="attachment_3151" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/08/16-Completed-branch.png" rel="lightbox[3179]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/08/16-Completed-branch-300x176.png" alt="Completed branch" title="Completed branch" width="300" height="176" class="size-medium wp-image-3151" /></a><p class="wp-caption-text">Completed branch</p></div>
<p>Branch/Tag Dialog에서 설정한 후 확인을 누르면, 위의 그림과 같이 Hello Project의 Branch인 hello-dev가 생성됩니다.</p>
<div id="attachment_3152" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/08/17-branched-hello.png" rel="lightbox[3179]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/08/17-branched-hello-300x193.png" alt="Branched hello" title="Branched hello" width="300" height="193" class="size-medium wp-image-3152" /></a><p class="wp-caption-text">Branched hello</p></div>
<p>Hello Project의 branches/hello-dev Folder안에 현재 trunk의 최신 Source인 test.c가 존재하는 것을 확인할 수 있습니다. 이제 Branch가 완료되었으니 hello-dev에서 새 기능을 위한 Code를 작성하면 됩니다.</p>
<div id="attachment_3153" class="wp-caption aligncenter" style="width: 304px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/08/18-RabbitVCS-Tag.png" rel="lightbox[3179]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/08/18-RabbitVCS-Tag-294x300.png" alt="RabbitVCS - Tag" title="RabbitVCS - Tag" width="294" height="300" class="size-medium wp-image-3153" /></a><p class="wp-caption-text">RabbitVCS - Tag</p></div>
<p>이번에는 Tag에 대해서 알아보도록 하겠습니다. Project가 어느 정도 안정화 되어 Version Up을 할 경우 이것을 배포하거나 따로 Source를 관리할 필요가 생기게 됩니다. 이럴 때 사용하는 것이 Tag 기능으로 간단하게 현재 trunk의 Source를 복제하여 Project의 Tag Folder 안에 관리하는 것을 의미합니다. </p>
<p>Tag를 사용하기 위해서는 Branch와 동일하게 Project의 tags Folder 안에서 Mouse 오른쪽 Button Popup을 띄운 후, RabbitVCS -> Branch/Tag를 Click합니다.</p>
<div id="attachment_3154" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/08/19-BranchAndTag-Dialog.png" rel="lightbox[3179]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/08/19-BranchAndTag-Dialog-300x240.png" alt="Branch/Tag Dialog" title="Branch/Tag Dialog" width="300" height="240" class="size-medium wp-image-3154" /></a><p class="wp-caption-text">Branch/Tag Dialog</p></div>
<p>Branch/Tag Dialog에서 Tag를 위해서는 Repository의 To에 대한 경로를 Project tags Folder내에 경로로 지정해 주면 됩니다. (위의 그림은 trunk의 현재 최신 Source를 tags/hello-1.0으로 복제하는 경우를 나타냄)</p>
<div id="attachment_3155" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/08/20-Completed-tag.png" rel="lightbox[3179]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/08/20-Completed-tag-300x176.png" alt="Completed tag" title="Completed tag" width="300" height="176" class="size-medium wp-image-3155" /></a><p class="wp-caption-text">Completed tag</p></div>
<p>Tag가 완료되면 hello-1.0이 tags Folder 안에 생성됩니다.</p>
<div id="attachment_3157" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/08/21-tagged-hello.png" rel="lightbox[3179]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/08/21-tagged-hello-300x193.png" alt="Tagged hello" title="Tagged hello" width="300" height="193" class="size-medium wp-image-3157" /></a><p class="wp-caption-text">Tagged hello</p></div>
<p>Tag 완료 후, tags/hello-1.0의 모습입니다. </p>
<div id="attachment_3158" class="wp-caption aligncenter" style="width: 298px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/08/22-Commit-branche-and-tag.png" rel="lightbox[3179]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/08/22-Commit-branche-and-tag-288x300.png" alt="Commit branch and tag" title="Commit branch and tag" width="288" height="300" class="size-medium wp-image-3158" /></a><p class="wp-caption-text">Commit branch and tag</p></div>
<p>Branch와 Tag가 완료되었지만 여기서 끝난 것은 아닙니다. Project 저장소에는 Branch/Tag를 한 Source가 아직 등록되지 않았기 때문에 생성된 Folder를 Project 저장소에 등록하기 위해 반드시 Commit을 해야 합니다. </p>
<p>위의 그림은 Commit Dialog의 예로 Branch를 통해 hello-dev가, Tag를 통해 hello-1.0이 생성된 것을 Commit하는 모습입니다. Commit이 완료되면 Branch와 Tag로 생성된 Directory가 Project 저장소에 적용됩니다.</p>
<h3>15. Merge</h3>
<p>위에서 알아봤던 Branch 기능으로 새 Branch를 만들어 새 기능의 개발을 끝내게 되었다면, 이제 원래 Source Tree에 합쳐서 새 기능이 적용되도록 만들어야 할 것입니다. 이 경우에 사용하는 것이 바로 Merge 기능입니다.</p>
<p>이전에 Branch로 만들었던 hello-dev를 가지고 Merge 기능에 대해서 알아봅시다.</p>
<p>branches/hello-dev/test.c를 다음과 같이 Postfix 연산을 Function으로 따로 만들어 저장합시다.</p>
<div class="codecolorer-container c mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #339933;">#include &lt;stdio.h&gt;</span><br />
<br />
<span style="color: #993333;">int</span> postfix<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> <span style="color: #339933;">*</span>a<span style="color: #009900;">&#41;</span> <br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>a<span style="color: #009900;">&#41;</span><span style="color: #339933;">++;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #993333;">int</span> a <span style="color: #339933;">=</span> <span style="color: #0000dd;">7</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;a++ == %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> postfix<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>a<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<table width="100%">
<tr>
<td width="50%"><div id="attachment_3190" class="wp-caption aligncenter" style="width: 260px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/09/01-RabbitVCS-Commit-branched-source.png" rel="lightbox[3179]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/09/01-RabbitVCS-Commit-branched-source-300x290.png" alt="RabbitVCS - Commit branched source" title="RabbitVCS - Commit branched source" width="250" height="240" class="size-medium wp-image-3190" /></a><p class="wp-caption-text">RabbitVCS - Commit branched source</p></div></td>
<td width="50%"><div id="attachment_3191" class="wp-caption aligncenter" style="width: 260px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/09/02-Commit-Dialog.png" rel="lightbox[3179]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/09/02-Commit-Dialog-288x300.png" alt="Commit Dialog" title="Commit Dialog" width="250" height="260" class="size-medium wp-image-3191" /></a><p class="wp-caption-text">Commit Dialog</p></div></td>
</tr>
</table>
<p>이제 저장된 branches/hello-dev/test.c를 Commit하여 Project 저장소에 적용시킵니다.</p>
<div id="attachment_3192" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/09/03-RabbitVCS-Merge.png" rel="lightbox[3179]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/09/03-RabbitVCS-Merge-300x234.png" alt="RabbitVCS - Merge" title="RabbitVCS - Merge" width="300" height="234" class="size-medium wp-image-3192" /></a><p class="wp-caption-text">RabbitVCS - Merge</p></div>
<p>이제 hello-dev와 trunk의 현재 Source를 합쳐보도록 하겠습니다. trunk Folder를 선택한 다음, Mouse 오른쪽 Button Popup에서 RabbitVCS -> Merge를 Click합니다.</p>
<div id="attachment_3193" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/09/04-Merge-Type.png" rel="lightbox[3179]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/09/04-Merge-Type-300x269.png" alt="Merge Type" title="Merge Type" width="300" height="269" class="size-medium wp-image-3193" /></a><p class="wp-caption-text">Merge Type</p></div>
<p>Merge 과정을 위한 Dialog가 표시됩니다. Step1 에서는 Merge Type을 선택할 수 있는데 각 Type은 다음과 같습니다.</p>
<ul>
<li>Merge a range of revisions : 대상 Folder에 하나의 Source Tree를 병합합니다. 1개의 branch에서 원하는 revision의 변경부분만 대상 Folder에 통합할 수도 있습니다.</li>
<li>Merge two differenct trees : 대상 Folder에 2개의 다른 Source Tree를 병합합니다. 2개의 branch의 내용을 병합하기 위해서 사용합니다.</li>
</ul>
<p>여기에서는 1개의 branch를 병합하는 것이므로 Merge a range of revisions를 선택하고 앞으로를 누릅니다.</p>
<div id="attachment_3194" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/09/05-Merge-a-range-of-revisions.png" rel="lightbox[3179]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/09/05-Merge-a-range-of-revisions-300x269.png" alt="Merge a range of revisions" title="Merge a range of revisions" width="300" height="269" class="size-medium wp-image-3194" /></a><p class="wp-caption-text">Merge a range of revisions</p></div>
<p>Step 2에서는 합칠 branch의 정보를 입력합니다. 각 Field에는 다음을 입력합니다.</p>
<ul>
<li>URL to merge from : 대상 Folder에 통합할 Branch의 Project 저장소 URL을 입력합니다.</li>
<li>Revision Range : 통합할 Branch에서 선택한 Revision만을 대상 Folder에 적용할 수 있습니다. comma(,)로 여러개를 입력할 수 있고, dash(-)는 범위를 나타냅니다. 옆의 돋보기 Icon을 Click하면 Commit Log를 통해서 원하는 Revision을 선택할 수 있도록 도와줍니다.
<p><div id="attachment_3195" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/09/06-Revision-Log.png" rel="lightbox[3179]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/09/06-Revision-Log-300x237.png" alt="Revision Log" title="Revision Log" width="300" height="237" class="size-medium wp-image-3195" /></a><p class="wp-caption-text">Revision Log</p></div>
</li>
</ul>
<p>대부분의 경우 Branch가 된 시점에서 부터 최신 Revision까지를 적용하게 됩니다. Commit Log를 보니 Revision 6에서 branch가 되었기 때문에 Revision Range에 6-HEAD(Revision 6에서 최신 Revision까지)를 입력해서 병합해 봅시다. 모두 입력했다면 앞으로를 누릅니다.</p>
<div id="attachment_3196" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/09/07-Final-Options.png" rel="lightbox[3179]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/09/07-Final-Options-300x269.png" alt="Final Options" title="Final Options" width="300" height="269" class="size-medium wp-image-3196" /></a><p class="wp-caption-text">Final Options</p></div>
<p>Step3에서는 Option을 설정할 수 있습니다. Recursive(하위 Folder까지 병합)는 반드시 선택합니다. Test Merge를 눌러서 Merge 설정이 제대로 되었는지 그리고 병합시 문제가 없는지를 Test해 봅시다.</p>
<div id="attachment_3197" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/09/08-Merge-Dry-Test.png" rel="lightbox[3179]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/09/08-Merge-Dry-Test-300x176.png" alt="Merge Dry Test" title="Merge Dry Test" width="300" height="176" class="size-medium wp-image-3197" /></a><p class="wp-caption-text">Merge Dry Test</p></div>
<p>Test Merge가 제대로 수행이 되었다면 위와 같이 merge_completed Message가 표시될 것입니다. 이상이 없다면 확인을 누른 후, Merge Dialog에서 적용을 누릅니다.</p>
<div id="attachment_3198" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/09/09-Merge-Complete.png" rel="lightbox[3179]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/09/09-Merge-Complete-300x176.png" alt="Merge Complete" title="Merge Complete" width="300" height="176" class="size-medium wp-image-3198" /></a><p class="wp-caption-text">Merge Complete</p></div>
<p>Test Merge가 성공적으로 끝났기 때문에 Merge도 위와 같이 정상적으로 이루어질 것입니다.</p>
<div id="attachment_3199" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/09/10-Nautilus-Merged-trunk-folder.png" rel="lightbox[3179]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/09/10-Nautilus-Merged-trunk-folder-300x193.png" alt="Nautilus - Merged trunk folder" title="Nautilus - Merged trunk folder" width="300" height="193" class="size-medium wp-image-3199" /></a><p class="wp-caption-text">Nautilus - Merged trunk folder</p></div>
<p>Nautilus에서 병합된 trunk Folder를 확인해봤습니다. 저의 경우는 branch된 이후로 trunk의 Source가 변경되었기 때문에 Conflict가 발생했네요. 생성된 각 File은 다음과 같은 의미를 갖고 있습니다.</p>
<ul>
<li>test.c.merge-left.r6 : Merge Dialog에서 입력했던 Revision Range의 시작 Revision의 Source입니다.</li>
<li>test.c.merge-right.r15 : Merge Dialog에서 입력했던 Revision Range의 끝 Revision의 Source입니다.</li>
<li>test.c.working : 병합되기 전 대상 Folder에 존재한 Source입니다.</li>
</ul>
<p>Merge로 일어난 Conflict는 Update로 발생한 Conflict와 마찬가지로 해당 Source(여기서는 test.c)를 수정한 다음, Resolve 기능을 사용하면 문제가 해결됩니다.</p>
<div id="attachment_3200" class="wp-caption aligncenter" style="width: 298px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/09/11-Commit-Dialog.png" rel="lightbox[3179]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/09/11-Commit-Dialog-288x300.png" alt="Commit Dialog" title="Commit Dialog" width="288" height="300" class="size-medium wp-image-3200" /></a><p class="wp-caption-text">Commit Dialog</p></div>
<p>Merge가 완료되었다면 Project 저장소에 적용하기 위해 Commit을 실행합니다. Commit까지 정상적으로 완료되었다면 Merge에 대한 모든 과정이 끝나게 됩니다.</p>
<h3>16. GEdit &#8211; RabbitVCS Plugin</h3>
<div id="attachment_3162" class="wp-caption aligncenter" style="width: 310px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/08/26-Gedit-RabbitVCS-Plugin.png" rel="lightbox[3179]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/08/26-Gedit-RabbitVCS-Plugin-300x168.png" alt="Gedit - RabbitVCS Plugin" title="Gedit - RabbitVCS Plugin" width="300" height="168" class="size-medium wp-image-3162" /></a><p class="wp-caption-text">Gedit - RabbitVCS Plugin</p></div>
<p>마지막으로 Gedit를 위한 RabbitVCS Plugin을 소개합니다. RabbitVCS Plugin을 설치하면 Subversion으로 관리되는 Source를 Gedit로 편집할 경우 Gedit 상에서 RabbitVCS의 기능을 편리하게 사용할 수 있습니다.</p>
<p>설치를 위해서 Terminal에서 다음과 같이 입력합니다.</p>
<div class="codecolorer-container bash mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">$ </span><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get install</span> rabbitvcs-gedit</div></td></tr></tbody></table></div>
<div id="attachment_3163" class="wp-caption aligncenter" style="width: 242px"><a href="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/08/27-Gedit-Preferences.png" rel="lightbox[3179]"><img src="http://ioriy2k.pe.kr/wordpress/wp-content/uploads/2011/08/27-Gedit-Preferences-232x300.png" alt="Gedit - Preferences" title="Gedit - Preferences" width="232" height="300" class="size-medium wp-image-3163" /></a><p class="wp-caption-text">Gedit - Preferences</p></div>
<p>설치된 RabbitVCS Plugin을 사용하기 위해서는 Gedit를 실행한 다음, 편집 -> 기본 설정 -> 플러그인 Tab에서 RabbitVCS를 Check한 후 닫기를 누르면 됩니다.</p>
<h3>17. 마치면서&#8230;</h3>
<p>이상으로 RabbitVCS를 설치하는 방법과 각 기능에 대해서 간단하게 알아보았습니다. </p>
<p>Source Code를 Subversion으로 관리할 때 IDE에서 제공하는 기능을 주로 사용함과 동시에 Nautilus에서 편하게 관리할 수 있는 RabbitVCS를 사용한다면 좀 더 편리하게 Source를 관리할 수 있을 것이라 생각합니다. </p>
<p>그럼 즐거운 Programming 생활(?)이 되시길.. <img src='http://ioriy2k.pe.kr/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
  
<div class="wp_license">
<p><a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/2.0/kr/"><img src="http://i.creativecommons.org/l/by-nc-nd/2.0/kr/88x31.png" alt="Creative Commons Attribution-NonCommercial-NoDerivs 2.0 Korea" class="alignleft" style="margin-top:4px;" />
</a>This work  is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/2.0/kr/">Creative Commons Attribution-NonCommercial-NoDerivs 2.0 Korea</a>.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://ioriy2k.pe.kr/archives/3179/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

