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