展讯调试工具使用心得.docx
《展讯调试工具使用心得.docx》由会员分享,可在线阅读,更多相关《展讯调试工具使用心得.docx(15页珍藏版)》请在冰豆网上搜索。
展讯调试工具使用心得
展迅调试工具使用心得
辛琦
一、简介
ChannelServer和Logel是展讯公司提供的手机实时诊断和测试工具。
ChannelServer提供手机和其他工具之间的数据中转服务。
ChannelServer和手机用串口的方式连接,和其他作为客户端的各种工具之间则用socket的方式连接。
Logel则是ChannelServer的一个客户端,提供获取和按格式输出手机发送的调试信息的服务。
二、ChannelServer
ChannelServer位于\SC6600D_BASE\Release\Tool_Cust\ChannelServer的bin目录下,而另一个Doc目录下则存放了ChannelServer的用户手册。
Bin目录下有如下的一些文件:
ChannelServer系统文件是ChannelServer运行时需要的文件。
转发的数据日志文件记录了工具和手机之间通讯的数据包:
Tool_To_CS.log:
所有从工具发到ChannelServer的消息
CS_To_MS.log:
所有从ChannelServer发到MS的消息
MS_To_CS.log:
所有从MS发到ChannelServer的消息
CS_To_Tool.log:
所有从ChannelServer发到工具的消息
运行ChannelServer后,ChannelServer的图标会出现在Windows的托盘区:
右键点击该图标后出现菜单:
Configure:
进入ChannelServer配置界面
ConnectMSSim:
连接到MS
DisconnectMSSim:
断开和MS的连接
MSAsserted:
设置ChannelServer为Assert状态。
当MS已处于Assert状态时,而ChannelServer为了可以查看MS的内部状态信息,必须设置为Assert状态。
ChannelServer处于Assert状态时,图标会变红。
LogData:
选中则开始记录ChannelServer中转的数据日志。
Show&LogData:
显示和记录ChannelServer中转的数据日志。
弹出窗口的Clear按钮可以清除显示的数据。
About:
ChannelServer的版本和作者信息
Exit:
退出ChannelServer
三、Logel
Logel位于\SC6600D_BASE\Release\Tool_Cust\Logel的bin目录下,而另一个Doc目录下则存放了Logel的用户手册。
Bin目录下存放的文件如下:
History目录下通常会有的一些文件:
以下是对定位问题有帮助的文件:
.ass:
AssertFrame窗口中的操作的日志文件
.lst:
Logel收到的消息的日志文件
.mem:
手机内存Dump文件
运行Logel后,会出现Logel的主窗口:
关于Logel使用的介绍,请参见Reference库上的文档:
$/20050810-展讯软件文档/调试工具/Logel用户手册.doc:
四、问题定位实例
当手机上出现Assert状态时,为了定位问题的方便,应当使用ChannelServer和Logel连接到手机,并获取相关的信息。
下面以一个实际的例子来介绍定位RS910手机上Assert问题的方法:
1、在ccapp.c文件中的CC_HandleEnterNumWinMsg函数中插入一段Assert代码
SCI_TRACE_LOW("win_id=%d,msg_id=%d,param=%x",win_id,msg_id,param);
SCI_PASSERT(0,("TestAssert"));
2、打开手机,进入拨号界面,手机出现Assert状态。
3、启动ChannelServer,连接到手机。
4、选择ChannelServer右键菜单的MSAsserted,设置ChannelServer为Asserted状态。
5、启动Logel,连接到ChannelServer,打开Logging开关。
6、点击Logel的Assert菜单。
Assert菜单有3个选项:
OpenAssertFrame:
打开Assert窗口
OpenMapFile:
打开符号映射文件。
AssertMS:
使手机端出现Assert状态。
7、由于手机已处于Assert状态,选择OpenAssertFrame打开Assert窗口。
Assert窗口是一个使用命令行操作的窗口,支持的命令如下:
命令
作用
0
打印帮助菜单
1
打印Asset信息
2
打印重要寄存器
3
转存手机内存到文件
4
打印内存分配信息
5
打印内存堆信息
6
打印Task信息
7
打印堆栈信息
8
打印每个线程的调用栈
9
读取指定地址和长度的内存数据
a
转存Task使用状况
f
重置MCU寄存器
8、键入1,查看Assert信息:
Assert信息分为3部分,版本信息、Assert信息、当前线程信息
>1
>
CurrentVersion:
SWversion:
RS910-V1.1.2.RS910-V1.1.2
HWversion:
RS910-V1.1.0
>
File:
ccapp.c
Line:
8909
PASSERT(0)
>
Currentthreadinfo:
>
ID:
0x15
Name:
T_P_APP
Tcb_Addr:
0x0404a9ec
Last_Err:
0xa
Stack_Start:
0x0404d8a0
Stack_End:
0x0404f7df
Queue_Name:
Q_P_APP
Queue_Total:
256
Queue_Used:
2
Queue_Available:
254
Queue_Start:
0x0404f7e0
Queue_End:
0x0404fbe0
线程信息中包含了线程堆栈地址和队列的信息,对定位问题是非常有用的信息。
9、键入8,查看调用栈:
最前面的就是当前Assert的线程,可以看到列出的都是函数地址,这是因为没有载入对应的符号映射文件。
>8
>
AllTaskCallbackFunctionList:
>
CurrentTask21(T_P_APP):
>Entryat[0x00007936]
>Entryat[0x0009acbc]
>Entryat[0x0003ddac]
>Entryat[0x0003a7ea]
>Entryat[0x0003a93c]
>Entryat[0x0003a97e]
>Entryat[0x000109f6]
>Entryat[0x00010b74]
>Entryat[0x000006f8]
>Entryat[0x00131ee4]
>***Reachtopofstack.***
选择Assert菜单下的OpenMapFile,载入编译的手机版本的目标库的符号映射文件:
再次键入命令8,可以看到函数地址都转换成了易读的函数名:
>8
>
AllTaskCallbackFunctionList:
>
CurrentTask21(T_P_APP):
>SCI_PAssert()
>CC_HandleEnterNumWinMsg()
>MMK_RunWinProc()
>MMK_DispatchToHandle()
>DispatchWinMSG()
>MMK_DispatchMSGQueue()
>MMI_ProcessMsg()
>APP_Task()
>_ThreadEntry()
>Entryat[0x00131ee4]
Ø***Reachtopofstack.***
10、获取当前寄存器的信息
键入命令2,获取寄存器的信息,R13寄存器是当前堆栈的地址指针:
>2
>
R0=0x00007970R1=0x00000093
R2=0x0000003fR3=0x20000013
R4=0x040500f4R5=0x000022cd
R6=0x00007959R7=0x00000000
R8=0x00000000R9=0x00000000
R10=0x0404d8a0R11=0x00000000
R12=0x00000000R13=0x0404f668
R14=0x00007959PC=0x00007970
SPSR=0x20000033CPSR=0x20000093
>SVCmode:
>
R13=0x0404f668R14=0x00007959
SPSR=0x20000033
>IRQmode:
>
R13=0x043fc7fcR14=0x00150e94
SPSR=0x00000033
>Abortmode:
>
R13=0x043fca04R14=0x00000000
SPSR=0x00000010
>Undefinedmode:
>
R13=0x043fc9fcR14=0x00000000
SPSR=0x00000010
11、查看其他线程的堆栈信息
使用命令7,可以获得所有线程的堆栈使用信息:
>7
>
Stackinfo:
>
Task_IDNameTotalSizeMax_UsedAvailableCur_PtrStartEnd
>
0x0T_CM4096197221240x040516cc0x04050e800x04051e7f
>
0x2T_KPDSVR8006565000x040531640x04052f700x0405328f
>
0x4T_AUDIO689635665400x4000e51c0x4000cb900x4000e67f
…….
12、读取内存信息,分析函数调用栈
当前栈顶地址是0x0404f668,可以读取栈顶指向的内存地址,分析函数调用栈,
这是定位Assert问题的非常重要的手段。
>9
>
Readmemory:
>Inputaddress:
>0x0404f668
>Inputsize(0>1024
>ReadMemoryStartAddress:
0x0404f668Size:
0x00000404
>0x0404f6680x000000000x0000a7780x0000000b0x01050100
>0x0404f6780x000079700x0404f6680x000000390x0009ac1c
>0x0404f6880x00090d680x000022cd0x040500f40x00000000
>0x0404f6980x000000000x000000000x000000000x0009ad0b
>0x0404f6a80x040500f40x000000000x000000000x00000000
>0x0404f6b80x000000000x000000000x000000000x00000000
>0x0404f6c80x000000000x000000000x000000000x00000000
>0x0404f6d80x000000000x00ef01230x000000000x0424b920
>0x0404f6e80x000000000x0003beb30x000000000x00000001
>0x0404f6f80x000000ba0x000000910x000000000x0424bc58
>0x0404f7080x0424bc580x000000000x000000000x0003ddeb
>0x0404f7180x0424bc580x000000910x000000000x0424bc58
>0x0404f7280x000000000x0424bc580x000000000x0003a8b9
>0x0404f7380x000000010x000000020x0424bb100x00000000
>0x0404f7480x000000010x000000000x000000000x00000001
>0x0404f7580x0424bc580x000000910x000000000x0404f790
>0x0404f7680x000000000x000000000x000000000x0003a96b
>0x0404f7780x0404f7900x000032170x000000000x0003a9ad
>0x0404f7880x000000010x00010a130x0424bc580x00000000
>0x0404f7980x009100000x000000000x000000000x00010c2d
>0x0404f7a80x04239d500x000000000x000000000x00000737
>0x0404f7b80x00010b750x000000000x000000000x00000000
>0x0404f7c80x000000000x00131eff0x000000000x00000000
>0x0404f7d80x000000000x5a5a5a5a0x042399e00x0423a160
…………..
13、Dump手机内存,分配函数调用栈
要分析函数调用栈,还可以使用Dump手机内存的方法。
键入命令3:
>3
>
Dumpingmemorytoafile,pleasewait......
>.......................................................................................................................................................................................................................................................................................................................................Savingmemorydatatothefile:
E:
\work\SC6600D_BASE\Release\Tool_Cust\Logel\Bin\History\2006_03_17_17_44_51_9960.mem
>
Dumpingmemorycompleted
>
打开生成的Dump文件,用出现Assert的线程的堆栈地址减去0x04000000,就是该内存地址在文件中的映射地址。
但是T_AUDIO任务的线程堆栈起始地址为0x4000cb90,而Dump的手机内存映射文件只有4306KB,很显然不适用上面的方法。
用命令9读一段T_AUDIO的堆栈内存数据,然后在映射文件中查找,发现T_AUDIO的堆栈位置和映射文件中的位置的差为0x3FBFF0C0。
14、查看内存使用情况
定位内存分配方面的问题,则命令4会有所帮助。
命令4把所有调用了SCI_Alloc的代码位置和所申请的内存大小都打印了出来,可以帮助分析:
>4
>
Allocatedmemoryinfo:
>
No.SizeFileName(Line)
>
2372efs_item.c(Line1472)
>
3800efs_item.c(Line1477)
>
4128efs_item.c(Line1478)
……
15、查看内存堆使用情况
输入命令5,可以查看当前的内存堆使用情况:
>5
>
MemoryPoolInformation:
>
Pool_NameStart_AddrEnd_AddrTotal_NumMax_UsedAvail_Num
>
Systemuint8heap0x04065e600x0420ee6017408001424281602228
>
pool_52heap0x0420ee600x0421e86080091717
>
pool_100heap0x0421e8600x04221a60100697
>
pool_300heap0x04221a600x04227410701061
>
pool_600heap0x042274100x0422eeb850745
>
pool_1600heap0x0422eeb80x04256aa8100597
需要注意的有2点:
1、曾经使用的最大数目加上现在的可用数目应当大于等于最大可用数
2、当固定大小的内存堆使用完后,再次申请会出现Assert。
比如pool_100_heap已经使用了100个,当还想继续申请时,就会出现Assert。
16、查看全局变量和静态变量
在定位问题时,可能还涉及到全局变量和静态变量,这时可以从编译生成的符号映射文件中,找到变量的地址,再用命令9或者从Dump的内存文件中获得该变量的值。
例如:
全局变量g_appinit_task_id在map文件中的定义如下:
g_appinit_task_id0x04050830Data4app_tasks.o(.bss)
从前面Dump下来的文件的偏移地址0x50830处,可以读到该变量的值。
参考文档:
ChannelServer用户手册.doc:
Logel用户手册.doc