source: libcf/trunk/include/cf_debug.h@ 34

Last change on this file since 34 was 34, checked in by cheese, 11 years ago

#1 add example code for doxygen

File size: 9.0 KB
Line 
1/**
2 * @file cf_debug.h
3 * @author myusgun <myusgun@gmail.com>
4 * @version 0.1
5 *
6 * @remark
7 * 디버그 함수를 직접 호출하지 않고 정의된 매크로를 사용하면,
8 * Preprocessor에 _DEBUG가 정의되어 있는 경우에 만
9 * 디버그 코드가 동작하도록 할 수 있음 <br />
10 * 디버그 메시지는 stdout 및 stderr를 이용한 파일 포인터 출력을 지원하고,
11 * 환경에 적합하도록 사용자가 구성한 컨텍스트를 이용하여 사용할 수도 있음 <br />
12 * (단, 콜스택의 푸시/팝은 컨텍스트를 이용해야만 사용 가능)
13 *
14 * @section 샘플코드
15 * @code
16
17#include "cf_debug.h"
18
19CF_Debug_Ctx gDebugCtx;
20
21void callee (void) {
22 CF_Debug_CallStack callstack;
23
24 CF_DEBUG_CALLSTACK_PUSH (gDebugCtx);
25 CF_DEBUG_CALLSTACK_POP (gDebugCtx, &callstack);
26}
27
28int main (void) {
29 int fd = 0;
30 gDebugCtx = CF_Debug_CreateCtx ();
31
32 CF_DEBUG_CALLSTACK_PUSH (gDebugCtx);
33
34 CF_DEBUG_TRACE (gDebugCtx, "print trace message with context to stderr\n");
35
36 fd = CF_File_Create ("debug.txt");
37 if (fd < 0) {
38 CF_DEBUG_PRINT (stderr, "error ...\n");
39 // error
40 }
41 CF_Debug_SetOutputFD (gDebugCtx, fd);
42
43 CF_DEBUG_TRACE (gDebugCtx, "print trace message with context to debug.txt\n");
44
45 CF_DEBUG_CALLSTACK_POP (gDebugCtx, NULL);
46
47 CF_Debug_DestroyCtx (gDebugCtx);
48
49 return 0;
50}
51
52 * @endcode
53 */
54#ifndef __CF_DEBUG_H__
55#define __CF_DEBUG_H__
56
57#include "cf_base.h"
58
59#include <stdio.h>
60
61#define CF_ERROR_DEBUG_INVALID_CTX CF_ERROR_DEBUG - 1
62#define CF_ERROR_DEBUG_SET_OUTPUT_FD CF_ERROR_DEBUG - 2
63#define CF_ERROR_DEBUG_PUSH_CALLSTACK CF_ERROR_DEBUG - 3
64#define CF_ERROR_DEBUG_POP_CALLSTACK CF_ERROR_DEBUG - 4
65
66/** Windows 함수 이름 매크로 재정의 */
67#ifdef _WIN32
68# define __func__ __FUNCTION__
69#endif
70
71#ifdef _DEBUG
72/**
73 * 디버그 컨텍스트 생성
74 *
75 * @see CF_Debug_CreateCtx
76 */
77# define CF_DEBUG_CREATE_CTX() \
78 CF_Debug_CreateCtx ()
79
80/**
81 * 디버그 컨텍스트 해제
82 *
83 * @param __ctx 디버그 컨텍스트
84 *
85 * @see CF_Debug_DestroyCtx
86 */
87# define CF_DEBUG_DESTROY_CTX(__ctx) \
88 CF_Debug_DestroyCtx (__ctx)
89
90/**
91 * 디버그 메시지를 지정된 파일 포인터로 출력
92 *
93 * @param __fp 파일 포인터. 표준출력(stdout) 및 표준오류(stderr) 사용 가능
94 * @param __fmt 포맷 스트링
95 * @param ... 가변 인자
96 *
97 * @see CF_Debug_Print
98 */
99# define CF_DEBUG_PRINT(__fp,__fmt,...) \
100 CF_Debug_Print (__fp,__FILE__,__func__,__LINE__,__fmt,##__VA_ARGS__)
101
102/**
103 * 바이너리 데이터를 디버그 메시지와 함께 지정된 파일 포인터로 출력
104 *
105 * @param __fp 파일 포인터. 표준출력(stdout) 및 표준오류(stderr) 사용 가능
106 * @param __bin 바이너리 데이터
107 * @param __len 바이너리 길이
108 * @param __fmt 포맷 스트링
109 * @param ... 가변 인자
110 *
111 * @see CF_Debug_PrintBin
112 */
113# define CF_DEBUG_PRINT_BIN(__fp,__bin,__len,__fmt,...) \
114 CF_Debug_PrintBin (__fp,__FILE__,__func__,__LINE__,__bin,__len,__fmt,##__VA_ARGS__)
115
116/**
117 * 컨텍스트를 업데이트하고 디버그 메시지를 출력
118 *
119 * @param __ctx 디버그 컨텍스트
120 * @param __fmt 포맷 스트링
121 * @param ... 가변 인자
122 *
123 * @see CF_DEBUG_UPDATE_CTX, CF_Debug_Trace
124 */
125# define CF_DEBUG_TRACE(__ctx,__fmt,...) \
126 CF_Debug_Trace (__ctx,__FILE__,__func__,__LINE__,__fmt,##__VA_ARGS__)
127
128/**
129 * 컨텍스트를 업데이트하고 바이너리 데이터를 디버그 메시지와 함께 출력
130 *
131 * @param __ctx 디버그 컨텍스트
132 * @param __bin 바이너리 데이터
133 * @param __len 바이너리 길이
134 * @param __fmt 포맷 스트링
135 * @param ... 가변 인자
136 *
137 * @see CF_DEBUG_UPDATE_CTX, CF_Debug_TraceBin
138 */
139# define CF_DEBUG_TRACE_BIN(__ctx,__bin,__len,__fmt,...) \
140 CF_Debug_TraceBin (__ctx,__FILE__,__func__,__LINE__,__bin,__len,__fmt,##__VA_ARGS__)
141
142/**
143 * 컨텍스트에 콜스택 푸시
144 *
145 * @param __ctx 디버그 컨텍스트
146 *
147 * @see CF_Debug_CallStackPush
148 */
149# define CF_DEBUG_CALLSTACK_PUSH(__ctx) \
150 CF_Debug_CallStackPush (__ctx,__FILE__,__func__,__LINE__)
151
152/**
153 * 컨텍스트에서 콜스택 팝
154 *
155 * @param __ctx 디버그 컨텍스트
156 * @param __callstack 콜스택 정보를 가져올 콜스택 데이터 구조체 포인터
157 *
158 * @see CF_Debug_CallStackPop, CF_Debug_CallStack
159 */
160# define CF_DEBUG_CALLSTACK_POP(__ctx,__callstack) \
161 CF_Debug_CallStackPop (__ctx,__callstack)
162#else // #ifdef _DEBUG
163# define CF_DEBUG_CREATE_CTX() NULL
164# define CF_DEBUG_DESTROY_CTX(__ctx)
165# define CF_DEBUG_UPDATE_CTX(__ctx)
166# define CF_DEBUG_PRINT(__fp,__fmt,...)
167# define CF_DEBUG_PRINT_BIN(__fp,__bin,__len,__fmt,...)
168# define CF_DEBUG_TRACE(__ctx,__fmt,...)
169# define CF_DEBUG_TRACE_BIN(__ctx,__bin,__len,__fmt,...)
170# define CF_DEBUG_CALLSTACK_PUSH(__ctx)
171# define CF_DEBUG_CALLSTACK_POP(__ctx,__callstack) 1
172#endif // #ifdef _DEBUG
173
174/** 디버그 컨텍스트 */
175typedef void * CF_Debug_Ctx;
176
177/** 콜스택 데이터 */
178typedef struct cf_debug_callStack {
179 char file[NAME_LENGTH + 1]; /**< 파일 이름 */
180 char function[NAME_LENGTH + 1]; /**< 함수 이름 */
181 int line; /**< 라인 넘버 */
182} CF_Debug_CallStack;
183
184#ifdef __cplusplus
185extern "C" {
186#endif
187
188/**
189 * 디버그 컨텍스트를 생성
190 *
191 * @return 성공 시, CF_Debug_Ctx 형태의 컨텍스트; 실패 시, NULL
192 * @see CF_DEBUG_CREATE_CTX
193 */
194CF_EXPORT CF_Debug_Ctx
195CF_Debug_CreateCtx (void);
196
197/**
198 * 디버그 컨텍스트를 해제
199 *
200 * @return 성공 시, CF_OK; 실패 시, 오류 코드
201 *
202 * @param ctx 디버그 컨텍스트
203 *
204 * @see CF_DEBUG_DESTROY_CTX
205 */
206CF_EXPORT int
207CF_Debug_DestroyCtx (CF_Debug_Ctx ctx);
208
209/**
210 * 디버그 컨텍스트에 출력할 파일 디스크립터를 설정
211 *
212 * @return 성공 시, CF_OK; 실패 시, 오류 코드
213 *
214 * @param ctx 디버그 컨텍스트
215 * @param fd 파일 디스크립터
216 *
217 * @see CF_File_Open, CF_File_Create
218 */
219CF_EXPORT int
220CF_Debug_SetOutputFD (CF_Debug_Ctx ctx,
221 int fd);
222
223/**
224 * 디버그 메시지를 지정된 파일 포인터로 출력
225 *
226 * @return 성공 시, CF_OK; 실패 시, 오류 코드
227 *
228 * @param fp 파일 포인터. 표준출력(stdout) 및 표준오류(stderr) 사용 가능
229 * @param file 파일 경로
230 * @param func 함수 이름
231 * @param line 라인 넘버
232 * @param fmt 포맷 스트링
233 * @param ... 가변 인자
234 *
235 * @see CF_DEBUG_PRINT
236 */
237CF_EXPORT int
238CF_Debug_Print (FILE * fp,
239 const char * file,
240 const char * func,
241 const int line,
242 const char * fmt, ...);
243
244/**
245 * 바이너리 데이터를 디버그 메시지와 함께 지정된 파일 포인터로 출력
246 *
247 * @return CF_OK 반환
248 *
249 * @param fp 파일 포인터. 표준출력(stdout) 및 표준오류(stderr) 사용 가능
250 * @param file 파일 경로
251 * @param func 함수 이름
252 * @param line 라인 넘버
253 * @param bin 라인 넘버
254 * @param len 바이너리 길이
255 * @param fmt 포맷 스트링
256 * @param ... 가변 인자
257 *
258 * @see CF_DEBUG_PRINT_BIN
259 */
260CF_EXPORT int
261CF_Debug_PrintBin (FILE * fp,
262 const char * file,
263 const char * func,
264 const int line,
265 const unsigned char * bin,
266 const int len,
267 const char * fmt, ...);
268
269/**
270 * 컨텍스트를 업데이트하고 디버그 메시지를 출력
271 *
272 * @return CF_OK 반환
273 *
274 * @param ctx 디버그 컨텍스트
275 * @param file 파일 경로
276 * @param func 함수 이름
277 * @param line 라인 넘버
278 * @param fmt 포맷 스트링
279 * @param ... 가변 인자
280 *
281 * @see CF_DEBUG_UPDATE_CTX, CF_Debug_Trace
282 */
283CF_EXPORT int
284CF_Debug_Trace (CF_Debug_Ctx ctx,
285 const char * file,
286 const char * func,
287 const int line,
288 const char * fmt, ...);
289
290/**
291 * 컨텍스트를 업데이트하고 바이너리 데이터를 디버그 메시지와 함께 출력
292 *
293 * @return 성공 시, CF_OK; 실패 시, 오류 코드
294 *
295 * @param ctx 디버그 컨텍스트
296 * @param file 파일 경로
297 * @param func 함수 이름
298 * @param line 라인 넘버
299 * @param bin 바이너리 데이터
300 * @param len 바이너리 길이
301 * @param fmt 포맷 스트링
302 * @param ... 가변 인자
303 *
304 * @see CF_DEBUG_UPDATE_CTX, CF_DEBUG_TRACE_BIN
305 */
306CF_EXPORT int
307CF_Debug_TraceBin (CF_Debug_Ctx ctx,
308 const char * file,
309 const char * func,
310 const int line,
311 const unsigned char * bin,
312 const int len,
313 const char * fmt, ...);
314
315/**
316 * 컨텍스트에 콜스택 푸시
317 *
318 * @return 성공 시, CF_OK; 실패 시, 오류 코드
319 *
320 * @param ctx 디버그 컨텍스트
321 * @param file 파일 경로
322 * @param func 함수 이름
323 * @param line 라인 넘버
324 *
325 * @see CF_DEBUG_CALLSTACK_PUSH
326 */
327CF_EXPORT int
328CF_Debug_CallStackPush (CF_Debug_Ctx ctx,
329 const char * file,
330 const char * func,
331 const int line);
332
333/**
334 * 컨텍스트에서 콜스택 팝
335 *
336 * @return 성공 시, CF_OK; 실패 시, 오류 코드
337 *
338 * @param ctx 디버그 컨텍스트
339 * @param callstack 콜스택 정보를 가져올 콜스택 데이터 구조체 포인터
340 *
341 * @see CF_Debug_CallStackPop, CF_Debug_CallStack
342 */
343CF_EXPORT int
344CF_Debug_CallStackPop (CF_Debug_Ctx ctx,
345 CF_Debug_CallStack * callstack);
346
347#ifdef __cplusplus
348}
349#endif
350
351#endif // #ifndef __CF_DEBUG_H__
Note: See TracBrowser for help on using the repository browser.