展讯调试工具使用心得

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

展迅调试工具使用心得
辛琦
一、简介
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配置界面
ChannelServer 使用的端口和MS连接的方式。

和实际硬件只能使用UART
选择COM口
选择波特率
当MS的CPU是Big Endian类型时,应当选中BigEndian选项消息等待处理的超时时间,单位为秒
刷新已连接的客户端列

连接到ChannelServer的
客户端列表
Connect MSSim:连接到MS
Disconnect MSSim: 断开和MS的连接
MS Asserted: 设置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, ("Test Assert") );
2、打开手机,进入拨号界面,手机出现Assert状态。

3、启动ChannelServer,连接到手机。

4、选择ChannelServer右键菜单的MS Asserted,设置ChannelServer为Asserted状
态。

5、启动Logel,连接到ChannelServer,打开Logging开关。

6、点击Logel的Assert菜单。

Assert菜单有3个选项:
Open Assert Frame:打开Assert窗口
Open Map File:打开符号映射文件。

Assert MS:使手机端出现Assert状态。

7、由于手机已处于Assert状态,选择Open Assert Frame打开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
>
Current Version:
SW version: RS910-V1.1.2.RS910-V1.1.2
HW version: RS910-V1.1.0
>
File: ccapp.c
Line: 8909
PASSERT(0)
>
Current thread info:
>
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
>
All Task Callback Function List:
>
Current Task 21 (T_P_APP):
> Entry at [0x00007936]
> Entry at [0x0009acbc]
> Entry at [0x0003ddac]
> Entry at [0x0003a7ea]
> Entry at [0x0003a93c]
> Entry at [0x0003a97e]
> Entry at [0x000109f6]
> Entry at [0x00010b74]
> Entry at [0x000006f8]
> Entry at [0x00131ee4]
> ***Reach top of stack.***
选择Assert菜单下的Open Map File,载入编译的手机版本的目标库的符号映射文件:
再次键入命令8,可以看到函数地址都转换成了易读的函数名:
> 8
>
All Task Callback Function List:
>
Current Task 21 (T_P_APP):
> SCI_PAssert()
> CC_HandleEnterNumWinMsg()
> MMK_RunWinProc()
> MMK_DispatchToHandle()
> DispatchWinMSG()
> MMK_DispatchMSGQueue()
> MMI_ProcessMsg()
> APP_Task()
> _ThreadEntry()
> Entry at [0x00131ee4]
➢***Reach top of stack.***
10、获取当前寄存器的信息
键入命令2,获取寄存器的信息,R13寄存器是当前堆栈的地址指针:> 2
>
R0 = 0x00007970 R1 = 0x00000093
R2 = 0x0000003f R3 = 0x20000013
R4 = 0x040500f4 R5 = 0x000022cd
R6 = 0x00007959 R7 = 0x00000000
R8 = 0x00000000 R9 = 0x00000000
R10 = 0x0404d8a0 R11 = 0x00000000
R12 = 0x00000000 R13 = 0x0404f668
R14 = 0x00007959 PC = 0x00007970
SPSR= 0x20000033 CPSR = 0x20000093
> SVC mode:
>
R13 = 0x0404f668 R14 = 0x00007959
SPSR = 0x20000033
> IRQ mode:
>
R13 = 0x043fc7fc R14 = 0x00150e94
SPSR = 0x00000033
> Abort mode:
>
R13 = 0x043fca04 R14 = 0x00000000
SPSR = 0x00000010
> Undefined mode:
>
R13 = 0x043fc9fc R14 = 0x00000000
SPSR = 0x00000010
11、查看其他线程的堆栈信息
使用命令7,可以获得所有线程的堆栈使用信息:
> 7
>
Stack info:
>
Task_ID Name TotalSize Max_Used Available Cur_Ptr Start End
>
0x0 T_CM 4096 1972 2124 0x040516cc 0x04050e80 0x04051e7f
>
0x2 T_KPDSVR 800 656 500 0x04053164 0x04052f70 0x0405328f
>
0x4 T_AUDIO 6896 356 6540 0x4000e51c 0x4000cb90 0x4000e67f
…….
12、读取内存信息,分析函数调用栈
当前栈顶地址是0x0404f668,可以读取栈顶指向的内存地址,分析函数调用栈,
这是定位Assert问题的非常重要的手段。

> 9
>
Read memory:
> Input address:
> 0x0404f668
> Input size(0< size < 1024):
> 1024
> Read Memory Start Address: 0x0404f668 Size: 0x00000404
> 0x0404f668 0x00000000 0x0000a778 0x0000000b 0x01050100 > 0x0404f678 0x00007970 0x0404f668 0x00000039 0x0009ac1c > 0x0404f688 0x00090d68 0x000022cd 0x040500f4 0x00000000 > 0x0404f698 0x00000000 0x00000000 0x00000000 0x0009ad0b > 0x0404f6a8 0x040500f4 0x00000000 0x00000000 0x00000000 > 0x0404f6b8 0x00000000 0x00000000 0x00000000 0x00000000 > 0x0404f6c8 0x00000000 0x00000000 0x00000000 0x00000000 > 0x0404f6d8 0x00000000 0x00ef0123 0x00000000 0x0424b920 > 0x0404f6e8 0x00000000 0x0003beb3 0x00000000 0x00000001 > 0x0404f6f8 0x000000ba 0x00000091 0x00000000 0x0424bc58 > 0x0404f708 0x0424bc58 0x00000000 0x00000000 0x0003ddeb > 0x0404f718 0x0424bc58 0x00000091 0x00000000 0x0424bc58 > 0x0404f728 0x00000000 0x0424bc58 0x00000000 0x0003a8b9 > 0x0404f738 0x00000001 0x00000002 0x0424bb10 0x00000000 > 0x0404f748 0x00000001 0x00000000 0x00000000 0x00000001 > 0x0404f758 0x0424bc58 0x00000091 0x00000000 0x0404f790 > 0x0404f768 0x00000000 0x00000000 0x00000000 0x0003a96b > 0x0404f778 0x0404f790 0x00003217 0x00000000 0x0003a9ad > 0x0404f788 0x00000001 0x00010a13 0x0424bc58 0x00000000 > 0x0404f798 0x00910000 0x00000000 0x00000000 0x00010c2d > 0x0404f7a8 0x04239d50 0x00000000 0x00000000 0x00000737 > 0x0404f7b8 0x00010b75 0x00000000 0x00000000 0x00000000 > 0x0404f7c8 0x00000000 0x00131eff 0x00000000 0x00000000 > 0x0404f7d8 0x00000000 0x5a5a5a5a 0x042399e0 0x0423a160 …………..
13、Dump手机内存,分配函数调用栈
要分析函数调用栈,还可以使用Dump手机内存的方法。

键入命令3:
> 3
>
Dumping memory to a file, please wait ......
> ................................................................................................................................................
.....................................................................................................................................................
.................................. Saving memory data to the file:
E:\work\SC6600D_BASE\Release\Tool_Cust\Logel\Bin\History\2006_03_17_17_44_51_99
60.mem
>
Dumping memory completed
>
打开生成的Dump文件,用出现Assert的线程的堆栈地址减去0x04000000,就是该内存地址在文件中的映射地址。

但是T_AUDIO任务的线程堆栈起始地址为0x4000cb90,而Dump的手机内存映射文件只有4306KB,很显然不适用上面的方法。

用命令9读一段T_AUDIO的堆栈内存数据,然后在映射文件中查找,发现T_AUDIO的堆栈位置和映射文件中的位置的差为0x3FBFF0C0。

14、查看内存使用情况
定位内存分配方面的问题,则命令4会有所帮助。

命令4把所有调用了SCI_Alloc的代码位置和所申请的内存大小都打印了出来,可以帮助分析:
> 4
>
Allocated memory info:
>
No. Size FileName (Line)
>
2 372 efs_item.c (Line 1472)
>
3 800 efs_item.c (Line 1477)
>
4 128 efs_item.c (Line 1478)
……
15、查看内存堆使用情况
输入命令5,可以查看当前的内存堆使用情况:
> 5
>
Memory Pool Information:
>
Pool_Name Start_Addr End_Addr Total_Num Max_Used Avail_Num
>
System uint8 heap 0x04065e60 0x0420ee60 1740800 142428 1602228
>
pool_52 heap 0x0420ee60 0x0421e860 800 91 717 >
pool_100 heap 0x0421e860 0x04221a60 100 6 97 >
pool_300 heap 0x04221a60 0x04227410 70 10 61 >
pool_600 heap 0x04227410 0x0422eeb8 50 7 45 >
pool_1600 heap 0x0422eeb8 0x04256aa8 100 5 97
需要注意的有2点:
1、曾经使用的最大数目加上现在的可用数目应当大于等于最大可用数
2、当固定大小的内存堆使用完后,再次申请会出现Assert。

比如pool_100_heap已经
使用了100个,当还想继续申请时,就会出现Assert。

16、查看全局变量和静态变量
在定位问题时,可能还涉及到全局变量和静态变量,这时可以从编译生成的符号映射文件中,找到变量的地址,再用命令9或者从Dump的内存文件中获得该变量的值。

例如:
全局变量g_appinit_task_id在map文件中的定义如下:
g_appinit_task_id 0x04050830 Data 4 app_tasks.o(.bss)
从前面Dump下来的文件的偏移地址0x50830处,可以读到该变量的值。

参考文档:
Channel Server 用户手册.doc:
Logel用户手册.doc。

相关文档
最新文档