关于开启lwIP协议栈的调试输出LWIP_DEBUGF
我们在分析lwIP协议栈的时候,会经常看到LWIP_DEBUGF()这个函数的⾝影。我想lwIP的作者可能为了便于⼈们去学习和使⽤lwIP⽽花了不少时间添加的。
其实对于初学者来说,
要把lwIP协议栈分析清楚不是⼀件容易的事情,尤其是对TCP/IP协议原理不是很了解的⼈。⽂件较多,函数较多,宏较多,调⽤关系相⽐⼀般的C程序来说较复杂。
我个⼈认为,有些时候开启⼀下lwIP的调试信息输出功能,⽆论是对于我们学习还是查以太⽹通信中的故障都是有帮助的。它能够lwIP协议栈中的⼀些内部函数调⽤关系,变量值,追踪信息等通过串⼝输出来。
总之,
1.可以查看函数的调⽤关系,跟踪程序流程。
2.查看各种协议的调试信息,关键变量的值。
3.通过以上掌握的很有针对性调试信息,我们可以以此为依据进⼀步地去优化我们的⼯程,保证各种资源的分配合理,了解到底是通信过程中的哪⼀个环节限制了⽹络的性能,然后加以改善。
其实,我觉得lwIP协议栈的调试上,作者也是花了不少⼼思的。把要输出地调试信息分为按协议类型(TCP,UDP,ICMP,),调试信息类型(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
#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
#define LWIP_DEBUGF(debug, message)
#endif
#endif
2.在lwIPopts.h的debug 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
以上宏定义很重要,如果没有定义,编译时候会出现错误,
错误如下:
LwIP\src\core\netif.c(293): error: #18: expected a ")"
LwIP\src\core\netif.c: LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | 3, ("netif: IP address of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
#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
3.当然通过串⼝输出的话,在main()函数⾥边还要初始化串⼝。
4.通过以上三步基本就可以了,如果没有,看是否在⽤到>LWIP_DEBUGF()函数的C⽂件中,#include "lwip/debug.h",或者是include了包含此头⽂件的其它头⽂件,如opt.h。
转载⾃;world/thread-226628-1-1.htmltcpip协议栈中的协议主要定义
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论