lwip调试信息输出tcp服务器,关于开启lwIP协议栈的调试输出LWIP_DEBUGF

本文介绍了如何开启lwIP协议栈的调试输出功能,通过LWIP_DEBUGF()函数来查看协议栈内部函数调用、变量值和追踪信息,帮助学习者理解和排查以太网通信问题。调试信息按协议类型、信息类型和级别分类管理,通过在debug.h和lwIPopts.h中设置宏定义来启用不同级别的调试输出。

关于开启lwIP协议栈的调试输出LWIP_DEBUGF

[复制链接]

我们在分析lwIP协议栈的时候,会经常看到LWIP_DEBUGF()这个函数的身影。我想lwIP的作者可能为了便于人们去学习和使用lwIP而花了不少时间添加的。

其实对于初学者来说,要把lwIP协议栈分析清楚不是一件容易的事情,尤其是对TCP/IP协议原理不是很了解的人。文件较多,函数较多,宏较多,调用关系相比一般的C程序来说较复杂。

我个人认为,有些时候开启一下lwIP的调试信息输出功能,无论是对于我们学习还是查找以太网通信中的故障都是有帮助的。它能够lwIP协议栈中的一些内部函数调用关系,变量值,追踪信息等通过串口输出来。

总之,

1.可以查看函数的调用关系,跟踪程序流程。

2.查看各种协议的调试信息,关键变量的值。

3.通过以上掌握的很有针对性调试信息,我们可以以此为依据进一步地去优化我们的工程,保证各种资源的分配合理,了解到底是通信过程中的哪一个环节限制了网络的性能,然后加以改善。

其实,我觉得lwIP协议栈的调试上,作者也是花了不少心思的。把要输出地调试信息分为按协议类型(TCP,UDP,ICMP,ARP....),调试信息类型(LWIP_DBG_TRACE,LWIP_DBG_STATE,LWIP_DBG_FRESH),调试信息级别(LWIP_DBG_LEVEL_OFF,LWIP_DBG_LEVEL_WARNING,LWIP_DBG_LEVEL_SERIOUS,LWIP_DBG_LEVEL_SEVERE)

之所以要这么做,其实就是对要输出的调试信息有一个更好的管理,当我们开启调试功能后,只输出相关的调试信息,无关的信息就不要输出了。

接下来以一个简单的例子,说一下,如何开启lwIP的调试功能。

1.找到debug.h,添加下面这个define。

#define LWIP_DEBUG

#ifdef LWIP_DEBUG

/** print debug message only if debug message type is enabled...

*  AND is of correct type AND is at least LWIP_DBG_LEVEL

*/

#define LWIP_DEBUGF(debug, message) do { \

if ( \

((debug) & LWIP_DBG_ON) && \

((debug) & LWIP_DBG_TYPES_ON) && \

((s16_t)((debug) & LWIP_DBG_MASK_LEVEL) >= LWIP_DBG_MIN_LEVEL)) { \

LWIP_PLATFORM_DIAG(message); \

if ((debug) & LWIP_DBG_HALT) { \

while(1); \

} \

} \

} while(0)

#else  /* LWIP_DEBUG */

#define LWIP_DEBUGF(debug, message)

#endif /* LWIP_DEBUG */

#endif /* __LWIP_DEBUG_H__ */

2.在lwIPopts.h的debug options部分,按如下设置,要调试什么就把前边的“//”注释去掉即可。

//*****************************************************************************

//

// ---------- Debugging options ----------

//

//*****************************************************************************

#if 1

#define U8_F "c"

#define S8_F "c"

#define X8_F "x"

#define U16_F "u"

#define S16_F "d"

#define X16_F "x"

#define U32_F "u"

#define S32_F "d"

#define X32_F "x"

extern void UARTprintf(const char *pcString, ...);

#define LWIP_PLATFORM_DIAG(x) {UARTprintf x;}

#define LWIP_DEBUG

#endif

#define LWIP_DBG_MIN_LEVEL              LWIP_DBG_LEVEL_OFF

//#define LWIP_DBG_MIN_LEVEL              LWIP_DBG_LEVEL_WARNING

//#define LWIP_DBG_MIN_LEVEL              LWIP_DBG_LEVEL_SERIOUS

//#define LWIP_DBG_MIN_LEVEL              LWIP_DBG_LEVEL_SEVERE

//#define LWIP_DBG_TYPES_ON               LWIP_DBG_ON

#define LWIP_DBG_TYPES_ON               (LWIP_DBG_ON|LWIP_DBG_TRACE|LWIP_DBG_STATE|LWIP_DBG_FRESH)

//#define ETHARP_DEBUG                    LWIP_DBG_ON

//#define NETIF_DEBUG                     LWIP_DBG_ON

//#define PBUF_DEBUG                      LWIP_DBG_ON

//#define API_LIB_DEBUG                   LWIP_DBG_ON

//#define API_MSG_DEBUG                   LWIP_DBG_ON

//#define SOCKETS_DEBUG                   LWIP_DBG_ON

//#define ICMP_DEBUG                      LWIP_DBG_ON

//#define IGMP_DEBUG                      LWIP_DBG_ON

//#define INET_DEBUG                      LWIP_DBG_ON

#define IP_DEBUG                        LWIP_DBG_ON

//#define IP_REASS_DEBUG                  LWIP_DBG_ON

//#define RAW_DEBUG                       LWIP_DBG_ON

//#define MEM_DEBUG                       LWIP_DBG_ON

//#define MEMP_DEBUG                      LWIP_DBG_ON

//#define SYS_DEBUG                       LWIP_DBG_ON

#define TCP_DEBUG                       LWIP_DBG_ON

//#define TCP_INPUT_DEBUG                 LWIP_DBG_ON

//#define TCP_FR_DEBUG                    LWIP_DBG_ON

//#define TCP_RTO_DEBUG                   LWIP_DBG_ON

//#define TCP_CWND_DEBUG                  LWIP_DBG_ON

//#define TCP_WND_DEBUG                   LWIP_DBG_ON

#define TCP_OUTPUT_DEBUG                LWIP_DBG_ON

//#define TCP_RST_DEBUG                   LWIP_DBG_ON

//#define TCP_QLEN_DEBUG                  LWIP_DBG_ON

//#define UDP_DEBUG                       LWIP_DBG_ON

//#define TCPIP_DEBUG                     LWIP_DBG_ON

//#define PPP_DEBUG                       LWIP_DBG_ON

//#define SLIP_DEBUG                      LWIP_DBG_ON

//#define DHCP_DEBUG                      LWIP_DBG_ON

//#define AUTOIP_DEBUG                    LWIP_DBG_ON

//#define SNMP_MSG_DEBUG                  LWIP_DBG_ON

//#define SNMP_MIB_DEBUG                  LWIP_DBG_ON

//#define DNS_DEBUG                       LWIP_DBG_ON

#endif /* __LWIPOPTS_H__ */

3.当然通过串口输出的话,在main()函数里边还要初始化串口。

4.通过以上三步基本就可以了,如果没有,看是否在用到>LWIP_DEBUGF()函数的C文件中,#include "lwip/debug.h",或者是include了包含此头文件的其它头文件,如opt.h。这是我调试打开一个网页时输出的调试信息:

[本帖最后由 academic 于 2011-3-14 17:12 编辑]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值