【C言語】C言語のデバッグ

5339 ワード

1 概要
       プログラムを作成すると、デバッガという重要な仕事があることはよく知られています.では、プログラムをデバッグするときに効率的で便利になるには、自分に合ったデバッグ部品を作成する必要があります.本明細書は、C 51、ARMなどの組み込みプラットフォームに適している.
2 著作権声明
ブロガー:E-Mouse
声明:飲水思源、転載は出所を表明してください.
           作品の内容、著作権、その他の問題については、30日以内にブロガーに連絡してください.
連絡先:[email protected]
原文住所:http://blog.csdn.net/dianzilaoshu
3 工具/原料
ソフトウェア:KEIL 5 C 51
ソース:My_Debug.h
4 方法/手順
4.1  My_Debug.hソース
/*******************************************************************************
  * Copyright (C), 2017 E-Mouse    [email protected]
  ******************************************************************************
  * @file    My_Debug.c
  * @author  Jon
  * @E-maill [email protected]
  * @version V1.0.0
  * @date    26-June-2017
  * @brief              。
  ****************************************************************************** 
  * @attention
  *
  *     :printf  
  *               
  * 
  *     :MY_ASSERT(message, assertion);
  *           MY_ERROR(message, expression, handler);  
  *           MY_DEBUGF(debug, message);
  * 
  ******************************************************************************
  * @update
  *
  * (Jon 20170626)
  *      
  *       
  * 
  *
  ******************************************************************************
  */
#ifndef __MY_DEBUG_H__
#define __MY_DEBUG_H__

#include "sys_opt.h"

#include "stdio.h"
     
/** lower two bits indicate debug level
 * - 0 all
 * - 1 warning
 * - 2 serious
 * - 3 severe
 */
#define MY_DBG_LEVEL_ALL     0x00
#define MY_DBG_LEVEL_OFF     MY_DBG_LEVEL_ALL /* compatibility define only */
#define MY_DBG_LEVEL_WARNING 0x01 /* bad checksums, dropped packets, ... */
#define MY_DBG_LEVEL_SERIOUS 0x02 /* memory allocation failures, ... */
#define MY_DBG_LEVEL_SEVERE  0x03
#define MY_DBG_MASK_LEVEL    0x03

/** flag for MY_DEBUGF to enable that debug message */
#define MY_DBG_ON            0x80U
/** flag for MY_DEBUGF to disable that debug message */
#define MY_DBG_OFF           0x00U

/** flag for MY_DEBUGF indicating a tracing message (to follow program flow) */
#define MY_DBG_TRACE         0x40U
/** flag for MY_DEBUGF indicating a state debug message (to follow module states) */
#define MY_DBG_STATE         0x20U
/** flag for MY_DEBUGF indicating newly added code, not thoroughly tested yet */
#define MY_DBG_FRESH         0x10U
/** flag for MY_DEBUGF to halt after printing this debug message */
#define MY_DBG_HALT          0x08U


/*    */
#ifndef MY_PLATFORM_ASSERT
#define MY_PLATFORM_ASSERT(x) \
    do \
    {   printf("Assertion \"%s\" failed at line %d in %s\r
", x, __LINE__, __FILE__); \ } while(0) #endif #ifndef MY_PLATFORM_DIAG #define MY_PLATFORM_DIAG(x) do {printf x;} while(0) #endif /* */ #ifndef MY_ASSERT #define MY_ASSERT(message, assertion) do { if(!(assertion)) \ MY_PLATFORM_ASSERT(message); } while(0) #else /* MY_NOASSERT */ #define MY_ASSERT(message, assertion) #endif /* MY_NOASSERT */ /* */ /** if "expression" isn't true, then print "message" and execute "handler" expression */ #ifndef MY_ERROR #define MY_ERROR(message, expression, handler) do { if (!(expression)) { \ MY_PLATFORM_ASSERT(message); handler;}} while(0) #else #define MY_ERROR(message, expression, handler) #endif /* MY_ERROR */ /* */ #ifndef MY_DEBUG /** print debug message only if debug message type is enabled... * AND is of correct type AND is at least MY_DBG_LEVEL */ #define MY_DEBUGF(debug, message) do { \ if ( \ ((debug) & MY_DBG_ON) && \ ((debug) & MY_DBG_TYPES_ON) && \ ((signed short int)((debug) & MY_DBG_MASK_LEVEL) >= MY_DBG_MIN_LEVEL)) { \ MY_PLATFORM_DIAG(message); \ if ((debug) & MY_DBG_HALT) { \ while(1); \ } \ } \ } while(0) #else /* MY_DEBUG */ #define MY_DEBUGF(debug, message) #endif /* MY_DEBUG */ #else //#define MY_ASSERT(message, assertion) //#define MY_ERROR(message, expression, handler) //#define MY_DEBUGF(debug, message) #endif /* __MY_DEBUG_H__ */ /************* (C) COPYRIGHT 2017 E-Mouse *****END OF FILE****************/
4.2  呼び出しの説明
4.2.1 My_Debug.h入力API
        ①printf関数を呼び出して関連情報を印刷します.printf印刷駆動インタフェースはプラットフォームによって異なります.ここでは説明しません.住:本人は51コアの単片機シリアルポートを採用してPCに印刷してデバッグします.
②システムオプションは個人的に決めます.例えば、システムオプションに工事上のデバッグが必要なファイルのスイッチを入れます.
4.2.1 My_Debug.h出力API
関連コードを読んでください.読めばわかります.
4.2  呼び出し例
MY_ASSERT("PCB must be deallocated outside this function", conn->pcb.tcp == NULL);
MY_ERROR("igmp_joingroup: attempt to join non-multicast address", ip_addr_ismulticast(groupaddr), return ERR_VAL;);
MY_DEBUGF(API_LIB_DEBUG, ("netconn_recv_data: received %p, len=%"U16_F"
", buf, len));
/*        */
MY_DEBUGF(MY_DBG_ON, ("Current code at line %d in %s!\r
",(unsigned short)__LINE__, __FILE__));
4 注意事項
keil 5 c 51に現在位置の行番号を印刷するには、強制的にタイプを変換する必要があります.そうしないと、現在のデータは予想とは異なります.