展讯调试工具使用心得.docx

上传人:b****5 文档编号:7745171 上传时间:2023-01-26 格式:DOCX 页数:15 大小:215.16KB
下载 相关 举报
展讯调试工具使用心得.docx_第1页
第1页 / 共15页
展讯调试工具使用心得.docx_第2页
第2页 / 共15页
展讯调试工具使用心得.docx_第3页
第3页 / 共15页
展讯调试工具使用心得.docx_第4页
第4页 / 共15页
展讯调试工具使用心得.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

展讯调试工具使用心得.docx

《展讯调试工具使用心得.docx》由会员分享,可在线阅读,更多相关《展讯调试工具使用心得.docx(15页珍藏版)》请在冰豆网上搜索。

展讯调试工具使用心得.docx

展讯调试工具使用心得

展迅调试工具使用心得

辛琦

一、简介

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 职高对口

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1