介绍
此页内容说明了使用Cisco IOS(r)平台上所提供的调试功能的一些基本指导原则,以及正确使用 debug ip packet 命令和有条件调试的示例。
注: 对于如何使用并解释特定的debug命令和输出,本文不加以说明。有关特定 debug 命令的信息,请参考相应的Cisco debug 命令参考文献。
debug 特权EXEC命令的输出提供有关各种网际互联事件的诊断 信息,这些事件一般涉及到协议状态和网络行为。
前提条件
本文读者应了解以下方面的一些知识:
通过控制面板、aux和vty端口与路由器相连。
基本IOS配置问题。
解释IOS调试命令输出。
警告
请谨慎使用 debug 命令。当解决具体问题时,通常只推荐在路由器技术支持人员提供指导的情况下使用这些命令。
在互联网络处于高负载的情况下,启用调试功能会中断路由器的运行。因此,若启用日志功能,则在控制面板端口日志消息超载的情况下,访问服务器可能会出现间歇性的中断。
在启动 debug 命令之前应始终考虑此命令将生成的输出及所花费的时间。例如,若您配置了有一个基本速率接口(BRI)的路由器,则 debug isdn q931 可能不会对系统产生危害。但是,在具有全部E1配置的AS5800上进行相同的调试,则可能生成许多输入,以致使系统“挂起”或停止响应。
在调试之前,通过 show processes cpu show processes cpu命令来查看CPU负载情况。开始调试之前应验证是否有足够的CPU。有关处理高CPU负载方面的信息 ,请参考“解决Cisco路由器上高CPU利用率问题”的文献。例如,若通过具有ATM接口的Cisco 7200路由器来进行桥接,那么根据所配置子接口数量的不同,重新启动路由器可能会使用大量的CPU。这是因为:对于每个虚电路(VC),都需要生成网桥协议数据单元(BPDU)数据包。在这样的重要时间内启动调试功能可能会使CPU利用率急剧增加,并导致系统挂起或网络断开。
注: 在运行调试功能时,特别是进行大量调试时,通常不出现路由器提示。但是,在大多数情况下,可以通过 no debug all 或 undebug all 命令来停止调试。有关安全使用调试的更多信息,请参考“ 获得调试输出 ”一章。
调试之前应注意的事项
除了上述几点外,还必须了解调试对平台稳定性的影响,并应考虑连接路由器上的哪个接口。以下的章节提供这方面的一些指导原则。
获得调试输出
路由器可显示各种接口的调试输出,其中包括控制面板、aux和vty端口。路由器还可将发送到内部缓冲器的日志消息记录到外部unix syslog服务器上。下面讨论每种方法的使用说明和注意事项:
控制面板端口
若在通常配置下连接到控制面板上,则无需额外工作。调试输出应自动显示。但是,必须保证按照要求来设置 logging console level ,并保证日志功能没有由 no logging console 命令而禁用。有关更多信息,请参考“ 使用Debug命令 ”的文献。
警告: 对路由器控制面板端口进行过多的调试可能引起路由器处于“挂起”状态。这是因为:在执行路由器其他功能之前,路由器对控制面板输出自动划分优先权。若路由器处理发送到控制面板端口的大型调试输出,路由器可能处于挂起状态。所以,若出现过多的调试输出,则使用vty (telnet)端口或日志缓冲器来获得调试输出。下面提供这方面的更多信息。
注: 在缺省情况下,控制面板端口上的日志功能处于启用状态。即使实际上使用一些其他端口或方法(如:Aux、vty或缓冲器)来捕获输出,控制面板端口通常也要处理调试输出。所以,在通常条件下,推荐始终启用 no logging console 命令,并使用其他方法来捕获调试输出。在需要使用控制面板的情况下,暂时将 logging console 设置为启用状态。
Aux端口
若通过辅助端口进行连接,则键入 terminal monitor命令。 还要验证路由器上 no logging on 命令是否处于禁用状态。
注: 若使用Aux端口来监视路由器,则时刻注意:在路由器重新启动的情况下,Aux端口不显示启动序列输出。若要查看启动序列,需连接控制面板端口。
VTY端口
若要通过辅助端口或远程登录进行连接,则键入 terminal monitor 命令,并验证no logging on 命令是否处于未用状态。
将信息记录到内部缓冲器
缺省的日志设备是控制面板;除非指定其他设备,否则在控制面板上显示所有消息。若要将日志信息记录到内部缓冲器上,则使用日志缓冲路由器配置命令。
此命令的全部句法如下:
logging buffered
no logging buffered
logging buffered 命令将日志消息复制到内部缓冲器上,而不是将这些消息写在控制面板中。缓冲器具有循环特性,新消息将覆盖旧消息。若要显示缓冲器中所记录的消息,则使用show logging特权EXEC命令。所显示的第1个消息是缓冲器中最旧的消息。可以指定缓冲器的大小,以及要记录的信息的重要级别。
提示:在输入缓冲器大小之前,要保证设备有足够的可用内存。使用 show proc mem IOS命令来查看可用内存。
通过 no logging buffered 命令,可禁用缓冲器,并将消息写入到控制面板中(缺省条件下)。
将信息记录到UNIX Syslog服务器
若要将日志信息记录到syslog服务器主机上,则使用日志路由器配置命令。此命令的全部句法如下:
logging <ip-address>
no logging <ip-address>
通过 logging 命令确定syslog服务器主机以接收日志消息。 <ip-address> 参数是主机的IP地址。通过多次发布此命令,可建立接收日志消息的syslog服务器列表。
通过 no logging 命令,可以删除具有syslogs列表中指定地址的syslog服务器。
有关设置syslog服务器的更多信息,请参照“ 使用调试命令”文献。
调试前其他准备工作
安装终端仿真器软件(例如,HyperTerminal) 以便将调试输出捕获到文件上。例如:在HyperTerminal中,点击Transfer, 然后点击Capture Text并选择相应的选项。有关更多信息,请参考“ 捕获 Hyperterminal 中文本输出”文献。有关其他终端仿真器软件,请参考软件文献。
通过以下业务时间标记命令来启用毫秒(msec)时间标记:
router(config)#service timestamps debug datetime msec
router(config)#service timestamps log datetime msec
这些命令将时间标记以MMM DD HH:MM:SS的格式添加到调试中,从而根据系统时钟来显示日期和时间。若未设置系统时钟,则日期和时间之前带有星号(*)以说明日期和时间可能不正确。
通常合理的办法是配置毫秒时间标记,这是因为:在查看调试输出时,通过这种办法可实现更高级别的准确性。对于相互联系的调试事件,毫秒时间标记提供了更好的指示说明。但是,值得注意的是,在控制面板端口输出大量信息时,可能不与事件的实际定时发生联系。例如,若启用标有200 VC方框中的 debug x25 all ,并将输出记录到缓冲器(使用 no logging console 和logging buffered 命令)的情况下,调试输出(在缓冲器范围内)所显示的时间标记可能不是数据包通过接口时的准确时间。因此,不要使用msec时间标记来证明性能情况,但可使用这种时间标记来获得事件发生时间的相对信息。
停止调试
若要停止调试,则使用 no debug all 或 undebug all 命令。通过show debug命令来验证是否已经关闭调试。
请注意,通过 no logging console 和 terminal no monitor 命名,只能分别使输出不在控制面板、Aux或 vty上发生,而不能停止调试,并因此用尽路由器资源。
使用 debug ip packet 命令
通过 debug ip packet 命令,可产生有关数据包的信息,这种数据包未经路由器进行快速转换。但是,由于生成每个数据包的输出,所以输出尺寸扩大,并因此使路由器处于“挂起”状态。所以,如本文所描述的那样,只在最严格的控制下使用 debug ip packet 。
限制 debug ip packet 输出的最佳办法是 创建与调试链接的访问列表。只有符合访问列表标准的数据包需要使用debug ip packet。不必在所有接口上都应用此访问列表,但非常适用于调试操作。
在使用 debugging ip packet之前,请注意:在缺省状态下,路由器进行快速交换,或在特定配置情况下进行CEF交换。也就是说,如果这些方法可用,则不向处理器提供数据包,因此,调试不显示任何内容。若要使调试显示内容,则需要通过no ip route-cache (适用于单点发送数据包)或no ip mroute-cache(适用于组播数据包)来禁止路由器上的快速交换。这种办法适用于传输业务的接口。通过 show ip route 命令来验证这种情况。
警告:
对于处理大量数据包的路由器,启用路由器上快速交换可增加CPU利用率,从而使设备处于“挂起”状态,并失去对等连接。
对于运行多协议标记 (MPLS) 交换的路由器,不要禁用路由器上的快速交换。MPLS是与CEF一起使用的。因此,禁用接口上的快速交换可导致很严重的后果。
下面研究一个示例方案:
router_122上所配置的访问列表是:
access-list 105 permit icmp host 10.10.10.2 host 13.1.1.1
access-list 105 permit icmp host 13.1.1.1 host 10.10.10.2
此访问列表允许所有互联网控制消息协议(ICMP)数据包从主机router_121(IP地址为10.10.10.2)传输到主机router_123(IP地址为13.1.1.1),以及传输到其他方向上。允许数据包传输到任一方向是很重要的,否则路由器可能会丢弃返回的ICMP数据包。
下面只删除router_122一个接口上的快速交换。因此,从IOS截取数据包的角度来看,只能看到传输到该接口的数据包的调试。通过调试,这类数据包将出现"d="。因为还没有关闭其他接口上的快速交换,返回的数据包将不使用debug ip packet。下面的输出显示了禁用快速交换的过程:
router_122(config)#interface virtual-template 1
router_122(config-if)#no ip route-cache
router_122(config-if)#end
现在必须通过以前定义的访问列表(访问列表 105)来激活debug ip packet。
router_122#debug ip packet detail 105
IP packet debugging is on (detailed) for access list 105
router_122#
00:10:01: IP: s=13.1.1.1 (Serial3/0), d=10.10.10.2 (Virtual-Access1),
g=10.10.10.2, len 100, forward
00:10:01: ICMP type=0, code=0
! -- 从13.1.1.1到10.10.10.2的ICMP包
! -- 显示此包是因为
! -- 它满足访问列表105中的源和目的地要求。
00:10:01: IP: s=13.1.1.1 (Serial3/0), d=10.10.10.2 (Virtual-Access1),
g=10.10.10.2, len 100, forward
00:10:01: ICMP type=0, code=0
00:10:01: IP: s=13.1.1.1 (Serial3/0), d=10.10.10.2 (Virtual-Access1),
g=10.10.10.2, len 100, forward
00:10:01: ICMP type=0, code=0
下面删除其他接口(router_122)上的快速路由。也就是通过这两个接口上的全部数据包现在是分组交换的(这是 debug ip packet所要求的):
router_122(config)#interface serial 3/0
router_122(config-if)#no ip route-cache
router_122(config-if)#end
router_122#
00:11:57: IP: s=10.10.10.2 (Virtual-Access1), d=13.1.1.1
(Serial3/0), g=172.16.1.6, len 100, forward
00:11:57: ICMP type=8, code=0
! -- 从10.10.10.2到13.1.1.1的ICMP 包(回送)
00:11:57: IP: s=13.1.1.1 (Serial3/0), d=10.10.10.2 (Virtual-Access1),
g=10.10.10.2, len 100, forward
00:11:57: ICMP type=0, code=0
! -- 从13.1.1.1 到10.10.10.2的ICMP 返回包(回送应答)
00:11:57: IP: s=10.10.10.2 (Virtual-Access1), d=13.1.1.1 (Serial3/0),
g=172.16.1.6, len 100, forward
00:11:57: ICMP type=8, code=0
00:11:57: IP: s=13.1.1.1 (Serial3/0), d=10.10.10.2 (Virtual-Access1),
g=10.10.10.2, len 100, forward
00:11:57: ICMP type=0, code=0
请注意: debug ip packet 输出不显示任何不符合访问列表标准的数据包。有关此过程的更多信息,请参考“了解Ping和Traceroute命令”的文献资料。
有关如何创建访问列表的更多信息,请参考“ 配置IP访问列表”的文献。
有条件的触发调试
在启用有条件触发调试功能的情况下,对于在特定接口路由器上发送或接收的数据包,路由器生成调试消息;对于通过不同接口发送或传输的数据包,路由器不生成调试输出。有关使用有条件调试的更多信息,请参考“有条件触发调试 ”的文献资料。
下面研究一下有条件调试的简单应用。考虑下面这个情况:下面所示的路由器(trabol)具有运行HDLC的两个接口(串口0和串口3)。
现在通过常用的 debug serial interface 命令来观察所有端口上所接收的HDLC保活信息。通过这种方法可以看到这两个接口上的保活信息。
traxbol#debug serial interface
Serial network interface debugging is on
traxbol#
*Mar 8 09:42:34.851: Serial0: HDLC myseq 28, mineseen 28*, yourseen 41, line up
! -- 接口Serial 0上HDLC保活
*Mar 8 09:42:34.855: Serial3: HDLC myseq 26, mineseen 26*, yourseen 27, line up
! -- 接口Serial 3上的HDLC保活
*Mar 8 09:42:44.851: Serial0: HDLC myseq 29, mineseen 29*, yourseen 42, line up
*Mar 8 09:42:44.855: Serial3: HDLC myseq 27, mineseen 27*, yourseen 28, line up
现在启用串接口3上的有条件调试。也就是说,只显示串接口3的调试。因此,使用 debug interface <interface_type interface_number>命令。
traxbol#debug interface serial 3
Condition 1 set
通过 show debug condition 命令来验证有条件调试是否处于启用状态。请注意,串接口3处于激活状态。
traxbol#show debug condition
Condition 1: interface Se3 (1 flags triggered)
Flags: Se3
traxbol#
请注意,现在只显示串接口3的调试:
*Mar 8 09:43:04.855: Serial3: HDLC myseq 29, mineseen 29*, yourseen 30, line up
*Mar 8 09:43:14.855: Serial3: HDLC myseq 30, mineseen 30*, yourseen 31, line up
若要取消有条件调试,则使用 undebug interface <interface_type interface_number>命令。 在关闭有条件触发器之前,最好关闭调试(例如,使用 undebug all) 。通过这种办法,可避免删除条件时出现调试输出泛滥。
traxbol#undebug interface serial 3
This condition is the last interface condition set.
Removing all conditions may cause a flood of debugging
messages to result, unless specific debugging flags
are first removed.
Proceed with removal? [yes/no]: y
Condition 1 has been removed
traxbol#
现在可以观察到显示两个串接口0和串接口3的调试。
*Mar 8 09:43:34.927: Serial3: HDLC myseq 32, mineseen 32*, yourseen 33, line up
*Mar 8 09:43:44.923: Serial0: HDLC myseq 35, mineseen 35*, yourseen 48, line up
警告:有些调试运行本身是有条件的,这方面的例子是atm调试。通过ATM调试,可明确地指定启用调试的接口,而不是启用所有atm接口上的调试并规定一种条件。
对于将ATM数据包调试限制到一个子接口上,下面内容说明了完成这一过程的正确方法:
arielle-nrp2#debug atm packet interface atm 0/0/0.1
! -- 请注意,我们明确指定将用于调试的子接口
ATM packets debugging is on
Displaying packets on interface ATM0/0/0.1 only
arielle-nrp2#
*Dec 21 10:16:51.891: ATM0/0/0.1(O):
VCD:0x1 VPI:0x1 VCI:0x21 DM:0x100 SAP:AAAA CTL:03 OUI:0080C2 TYPE:0007 Length:0x278
*Dec 21 10:16:51.891: 0000 FFFF FFFF FFFF 0010 7BB9 BDC4 0800 4500 025C 01FE
0000 FF11 61C8 0A30
*Dec 21 10:16:51.891: 4B9B FFFF FFFF 0044 0043 0248 0000 0101 0600 0015 23B7
0000 8000 0000 0000
*Dec 21 10:16:51.891: 0000 0000 0000 0000 0000 0000 0010 7BB9 BDC3 0000 0000
0000 0000 0000 0000
*Dec 21 10:16:51.891: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000
*Dec 21 10:16:51.891: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000
*Dec 21 10:16:51.891: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000
*Dec 21 10:16:51.891: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000
*Dec 21 10:16:51.895: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000
*Dec 21 10:16:51.895:
arielle-nrp2#
当设法启用所有端口上的 atm debugging (通过适用的条件)时,若路由器上存在大量ATM子接口,则路由器可能处于“挂起”状态。下面举例说明了atm 调试的不正确方法。
在这种情况下,可以看到应用一种条件,但还可以看到这种应用未产生作用,并仍然可以看到其他接口所发送的数据包。在此实验室练习方案中,只存在两个接口和很少量的业务。若接口数量很大,则所有接口的调试输出将相当高,并可使路由器处于挂起状态。
arielle-nrp2#show debugging condition
Condition 1: interface AT0/0/0.1 (1 flags triggered)
Flags: AT0/0/0.1
! -- 指定接口的条件。
arielle-nrp2#debug atm packet
ATM packets debugging is on
Displaying all ATM packets
arielle-nrp2#
*Dec 21 10:22:06.727: ATM0/0/0.2(O):
! -- 我们从接口ATM0/0/0/.2查看调试,
! -- 尽管其条件只指定了AT0/0/0.1
VCD:0x2 VPI:0x5 VCI:0x37 DM:0x100 SAP:AAAA CTL:03 OUI:0080C2
TYPE:000E Length:0x2F
*Dec 21 10:22:06.727: 0000 0000 0180 0000 107B B9BD C400 0000 0080 0000 107B B9BD
C480 0800 0014
*Dec 21 10:22:06.727: 0002 000F 0000
*Dec 21 10:22:06.727: un a
*Dec 21 10:22:08.727: ATM0/0/0.2(O):
VCD:0x2 VPI:0x5 VCI:0x37 DM:0x100 SAP:AAAA CTL:03 OUI:0080C2
TYPE:000E Length:0x2F
*Dec 21 10:22:08.727: 0000 0000 0180 0000 107B B9BD C400 0000 0080 0000 107B B9BD
C480 0800 0014
*Dec 21 10:22:08.727: 0002 000F 0000
*Dec 21 10:22:08.727: ll
*Dec 21 10:22:10.727: ATM0/0/0.2(O):
VCD:0x2 VPI:0x5 VCI:0x37 DM:0x100 SAP:AAAA CTL:03 OUI:0080C2
TYPE:000E Length:0x2F
*Dec 21 10:22:10.727: 0000 0000 0080 0000 107B B9BD C400 0000 0080 0000 107B B9BD
C480 0800 0014
*Dec 21 10:22:10.727: 0002 000F 0000
*Dec 21 10:22:10.727:
*Dec 21 10:22:12.727: ATM0/0/0.2(O):
VCD:0x2 VPI:0x5 VCI:0x37 DM:0x100 SAP:AAAA CTL:03 OUI:0080C2
TYPE:000E Length:0x2F
*Dec 21 10:22:12.727: 0000 0000 0080 0000 107B B9BD C400 0000 0080 0000 107B B9BD
C480 0800 0014
*Dec 21 10:22:12.727: 0002 000F 0000
*Dec 21 10:22:12.727:
*Dec 21 10:22:13.931: ATM0/0/0.1(O):
! -- 我们还可以根据需要查看接口ATM0/0/0.1的调试。
VCD:0x1 VPI:0x1 VCI:0x21 DM:0x100 SAP:AAAA CTL:03 OUI:0080C2 TYPE:0007 Length:0x278
*Dec 21 10:22:13.931: 0000 FFFF FFFF FFFF 0010 7BB9 BDC4 0800 4500 025C 027F 0000
FF11 6147 0A30
*Dec 21 10:22:13.931: 4B9B FFFF FFFF 0044 0043 0248 0000 0101 0600 001A 4481 0000
8000 0000 0000
*Dec 21 10:22:13.931: 0000 0000 0000 0000 0000 0000 0010 7BB9 BDC3 0000 0000 0000
0000 0000 0000
*Dec 21 10:22:13.931: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000
*Dec 21 10:22:13.931: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000
*Dec 21 10:22:13.931: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000
*Dec 21 10:22:13.931: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000
*Dec 21 10:22:13.935: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000