#ifndef lxx_hss_dbg_hss #define lxx_hss_dbg_hss /**************************************************************************************************\ *... ...
#ifndef __HSS_DBG_HSS__ #define __HSS_DBG_HSS__ /**************************************************************************************************\ * 2009-06-28 調試信息輸出的巨集版
(1) 一定起作用的巨集 __trace, __trace_file, __trace_fmt, __trace_end (2) 需要定義 __dbg__才有作用的巨集 __if, _if, __trace_dbg, __trace_file_dbg, __trace_fmt_dbg, __trace_end_dbg (巨集名dbg在後面,是為了在搜索__trace的時候可以找到所有的巨集) (3) 用法示例: __trace "a=%d b=%d\r\n", a, b); __trace_end __trace_file "a=%d b=%d\r\n", a, b); __trace_end //註意:這個巨集有參數 ,並且在巨集的參數括弧的後面,不能有逗號 __trace_fmt(__FILE__, __LINE__, TRUE) "a=%d b=%d", a, b); __trace_end 其中__FILE__可以替換為其他文件名,若是全路徑會只顯示文件名 (4) __if 是長格式版,顯示條件的內容 (5) _if 是短格式版,不顯示條件的內容,僅顯示條件的值 \**************************************************************************************************/ #include <shlwapi.h> #pragma comment(lib, "shlwapi.lib") /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #define __trace_end if (__sztrace && __sztrace[0]) \ OutputDebugStringA(__sztrace); \ } #define __trace \ { \ char __sztrace[260] = {0}; \ _snprintf(__sztrace, sizeof(__sztrace), #define __trace_file \ { \ char __sztrace[260] = {0}; \ int _n = _snprintf(__sztrace, sizeof(__sztrace)-1, "%08X %s/%d ", GetCurrentThreadId(), strrchr(__FILE__, '\\') + 1, __LINE__); \ _snprintf(__sztrace+_n, sizeof(__sztrace)-_n-1, #define __trace_fmt(file, line, error) \ { \ char __sztrace[260] = {0}; \ int __n = 0; \ if (file && ((char*)file)[0]) \ { \ LPCTSTR __p = strrchr(file, '\\'); \ if (__p == 0) \ __p = file; \ __n += _snprintf(__sztrace+__n, sizeof(__sztrace)-1-__n, "%s ", __p); \ } \ if (line) \ { \ __n += _snprintf(__sztrace+__n, sizeof(__sztrace)-1-__n, "/%d ", line); \ } \ if (error) \ { \ int se = GetLastError(); \ LPSTR __lpMsgbuf = 0; \ if (FormatMessage( \ FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, \ NULL, \ se, \ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), \ (LPSTR) & __lpMsgbuf, \ 0, \ NULL) \ ) \ { \ if (__lpMsgbuf && __lpMsgbuf[0]) \ { \ __n += _snprintf(__sztrace+__n, sizeof(__sztrace)-1-__n, "%s (%d) ", __lpMsgbuf, se); \ } \ if (__lpMsgbuf) \ { \ LocalFree( __lpMsgbuf ); \ } \ } \ } \ __n += _snprintf(__sztrace+__n, sizeof(__sztrace)-1-__n, /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //sample : __trace_bytes("profix", pData, cbData) __trace_end; #define __trace_bytes(Profix, pData, cbData) \ { \ int __size = cbData * 3 + (Profix == 0 ? 0 : strlen(Profix)) + 32; \ char* __sztrace = (char*)alloca(__size); \ LPBYTE __p = (LPBYTE)pData; \ if (__sztrace) \ { \ int __n = _snprintf(__sztrace, __size-1, "%s", Profix); \ for (int __l = 0 ; __l < cbData ; __l ++) \ { \ DWORD __d = (DWORD)__p[__l]; \ __n += _snprintf(__sztrace + __n, __size-1-__n, "%02X ", __d); \ } \ __n += _snprintf(__sztrace + __n, __size-1-__n, "(%d)", cbData); \ __sztrace[__n] = 0; \ __sztrace[__size-1] = 0; \ } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #define __FL__ __trace_file "\r\n");__trace_end; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifdef __dbg__ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #define __trace_end_dbg __trace_end #define __trace_dbg __trace #define __trace_file_dbg __trace_file #define __trace_fmt_dbg __trace_fmt /**************************************************************************************************\ * 2009-06-28 顯示程式的分支和判斷的值 長格式:__if 顯示判斷的條件的文本 短格式:_if 不顯示判斷的條件的文本 \**************************************************************************************************/ #define __if_false(x) \ { \ char __szif[256] = {0}; \ if (!(x)) \ { \ _snprintf(__szif, sizeof(__szif)-1, "%s/%d %d == ("#x")\r\n", strrchr(__FILE__, '\\') + 1, __LINE__, (x)); \ OutputDebugStringA(__szif); \ } \ } \ if (x) /////////////////////////////////////////////////////////////////////////////////////////////////// #define __if_true(x) \ { \ char __szif[256] = {0}; \ if (x) \ { \ _snprintf(__szif, sizeof(__szif)-1, "%s/%d %d == ("#x")\r\n", strrchr(__FILE__, '\\') + 1, __LINE__, (x)); \ OutputDebugStringA(__szif); \ } \ } \ if (x) /////////////////////////////////////////////////////////////////////////////////////////////////// #define __if(x) \ { \ char __szif[256] = {0}; \ if (x) \ { \ _snprintf(__szif, sizeof(__szif)-1, "%s/%d %d == ("#x")\r\n", strrchr(__FILE__, '\\') + 1, __LINE__, (x)); \ } \ else \ { \ _snprintf(__szif, sizeof(__szif)-1, "%s/%d %d == ("#x")\r\n", strrchr(__FILE__, '\\') + 1, __LINE__, (x)); \ } \ OutputDebugStringA(__szif); \ } \ if (x) /////////////////////////////////////////////////////////////////////////////////////////////////// #define _if(x) \ { \ char __szif[256] = {0}; \ if (x) \ { \ _snprintf(__szif, sizeof(__szif)-1, "%s/%d %d \r\n", strrchr(__FILE__, '\\') + 1, __LINE__, (x)); \ } \ else \ { \ _snprintf(__szif, sizeof(__szif)-1, "%s/%d %d \r\n", strrchr(__FILE__, '\\') + 1, __LINE__, (x)); \ } \ OutputDebugStringA(__szif); \ } \ if (x) /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #else /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #define _if(x) if(x) #define __if(x) if(x) #define __if_true(x) if(x) #define __if_false(x) if(x) #define __trace_end_dbg } #define __trace_dbg if (0) { ( #define __trace_file_dbg if (0) { ( #define __trace_fmt_dbg if (0) { ( /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #endif /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #endif