新闻  |   论坛  |   博客  |   在线研讨会
基于uTrace-ICD仿真器Linux内核,驱动以及应用层的源码级调试的实现
embed2009 | 2009-06-08 14:57:31    阅读:2012   发布文章

简介

        大家可能会对uTrace-ICD比较陌生,简单介绍一下,uTrace-ICD是TRACE32-ICD的兼容机。在这里我首先感谢国人的努力能让我用很少的RMB用上这么高端仿真器。废话少说,下面我给大家介绍一下uTrace-ICD下具体实现Linux调试的具体过程。


       大概介绍一下实现的具体原理,首先要有一块可用的目标板,我选用的是SMDK2410评估板。编译环境是在虚拟VMware+RedHat9.0,调试环境是uTRACE。在这里有个问题:就是在虚拟机下编译的arm linux内核如何传递给安装在Windows下的uTRACE。我用的方法就是通过SMB服务器。在Redhat9.0下配置SMB Server将arm linux的源码包通过网络共享的方式共享给Windows XP。在XP下的Windows资源管理器中将Redhat9.0共享的arm linux源码包影射为本地的一个虚拟盘比如是:Z盘。这样uTRACE就可以象操作本地盘一样来读取Redhat9.0中的arm linux源码包以及编译生成的内核映像及内核的符号表。

        对于uTRACE调试器来说,需要的东东就是包含调试信息的arm linux的内核映像vmlinux。在这里要注意"包含调试信息",arm linux内核配置选项默认可能是不包含调试信息,如果将没有包含调试信息的vmlinux供uTRACE使用是实现不了内核源码级调试的。所以我们在配置arm linux内核时一定要将包含内核调试信息的选项选上。具在"kernel hacking"下。其次uTRACE调试器需要的就是arm linux内核源码树。调试器的工作原理就是通过给定的地址查找对应的符号表找到对应的符号,以及符号所在文件的路径信息,行信息等,近而找到源程序所对应的函数或变量。

        简单介绍了uTRACE调试的基本原理,接下来,具体介绍一下arm linux内核,驱动,及应用层源码级调试的具体实现过程。

    具体实现

    上一节简单介绍了uTrace-ICD调试的基本原理,下面将详细介绍调试的具体实现过程。


    首先介绍一下我用的评估板SMDK2410的具体情况。目标板是nor flash启动,大小为8M,SDRAM配置情况是32M,首地址是0x30000000。软件配置情况:bootloader为ppcboot2.0,arm linux内核为2.4内核(实现过程对2.6内核也适用)。


第一步:配置虚拟机Redhat9.0编译环境。


    安装交叉编译器arm-elf-gcc,解压arm linux源码包到“\SMDK2410\kernel”下,解压ppcboot到“\SMDK2410\ppcboot-2.0.0”下。
    配置SMB Server将“\SMDK2410”目录网络共享出去。在Windows XP下同过网上邻居访问此目录并映像为本地磁盘“Z盘“,这样uTRACE就可以像访问本地文档一样访问Linux下的文档了。

    接下来编译ppcboot以及arm linux内核生成可执行映像,分别为ppcboot及vmlinux(注意在配置arm linux内核时将“Kernel Hacking”下“Include debugging Information in kernel binary”选项选上--生成调试信息)。

第二步:bootloader的调试。

    以上开发环境都建立好,我们可以开始PPCBOOT的调试。打开uTRACE-ICD调试软件,目标板上电。在System Settings里选CPU为S3C2410X,然后点UP使CPU进入调试状态。打开反汇编窗口,命令为Data.list,可以查看当前PC处反汇编情况。此时PC指向arm复位地址0x0即nor flash上内容的反汇编,此时我们也可以在flash上进行调试。以下连结是反汇编图。

     NOR Flash反汇编

    此时查看的代码为Flash上固化的代码。我们可以在Flash上进行单步调试,设置断点(注意在Flash上调试,只能设置Onchip断点,并且ARM9最多支持两个)。


    如果要在Flash上实现源码级的调试,我们需要加载包含当前代码的带调试信息的目标文件。对ppcboot来说,在ppcboot源代码目录下经交叉编译会生成ppcboot档,这个就是带调式信息的目标文件,本例就是要加载它,并且要注意,编译生成的目标文件与烧录到Flash上的代码是同一个版本,否则加载的调试信息将是错误的调试信息,代码对应上将会出错。


    我们用命令行方式加载调试信息,命令如下:Data.LOAD.Elf Z:\ppcboot-2.0.0\ppcboot /gnu /nocode /strippart

"/SMDK2410/" /path "Z:\"

其中

Data.LOAD.Elf指定是以ELF档格式加载


Z:\ppcboot-2.0.0\ppcboot 指定文件的全路径


/nocode 指定只加载调试信息,而不加载可执行代码,此时代码已经固化到Flash上,不需要再加载。


/strippart "/SMDK2410/"将调试信息中包含"/SMDK2410/"的部分去掉,因为可执行档是在linux环境中编译的,其中,编译出的调试信息中路径信息包含 "/SMDK2410/",由于Windows中无法以包含这个字符串的路径来搜索文件,所以要将其剥去。


/path "Z:\" 告诉uTRACE-ICD搜索路径在Z:\盘。


加载后,我们就可以以源码的方式来调试PPCBOOT了,如下:

     PPCboot源码调试

C与汇编混合模式:

    PPCboot源码交叉汇编调试

 

第三步:ARM Linux的调试。

   首先将C:\T32\demo\arm\kernel\(uTrace安装目录)目录下的linux整个目录拷贝到自己的工作目录,比如说E:\SMDK2410下。Linux目录下是关于linux内核调试的一些配置文件。打开E:\SMDK2410下linux目录,新建一个目录取名为SMDK2410,将integrator目录下的内容完全拷贝到新建的目录中。然后根据自己的目标板修改linux.cmm文件。修改后载入uTrace调试运行。

          linux.cmm脚本调试图

单步调试运行linux.cmm脚本。脚本会控制程序运行到linux内核入口start_kernel(具体实现是在start_kernel这个地址处设置Onchip端点)如下图所示:

         start_kernel处源码调试

我们在这里可以单步跟踪内核启动流程,来学习内核的初始化过程并且可以通过符号表来定位程序或变量所在的文件,并且可以在程序或变量所在处设置断点(硬件断点或软件断点或WatchPoint断点)。

加载linux内核感应模块(即uTrace对arm linux的支持模块,因为uTrace可以支持多种操作系统调试比如Wince Vxworks等基本上所有常用操作系统的调试,为了支持对应操作系统必须将对应操作系统的支持模块加载近来以支持该系统内核模块的调试),会在主菜单增加linux主菜单,其下是关于linux内核的多种信息。

           增加的linux菜单

其中有Display Tasks,ps,Display Moduoles,Display File System等子菜单。下面详细介绍其中每个菜单项的作用。

1.Display Tasks

查看系统内核心中每个任务的详细状态。

             Display Tasks菜单图

双击任务前的magic可以查看每个任务的详细情况。

其中包含:relationship标志本进程父子进程关系。

Arguments标志本进程运行参数

Environment标志本进程运行环境变量。

Open files 标志本进程打开的档

Addresses 标志本进程代码地址,数据地址,堆栈地址及大小。

Code file 标志代码由哪些档组成,包括可执行文件,动态连接库,以及它们的起始地址。

Times 标志进程时间信息启动时间,休眠时间等。

         TreeView任务图

 

2.PS子菜单

同linux控制台命令ps命令。

         PS菜单命令图

3.Display modules

显示系统中加载的模块信息,包含模块名,模块的代码地址,数据地址,以及模块被使用情况。

 

4.Display File System

查看系统中支持的文件系统的类型

         Display File System菜单命令图

查看系统中加载的文件系统的类型

        Mounted file System菜单命令图

查看/proc文件系统

        proc文件系统菜单命令图

 

第四步:ARM Linux任务调试。

下面以调试简单的打印”Hello World”任务为调试对象,介绍任务级调试的实现方法。可执行档为hello。要调试hello可执行档,在linux.cmm档中执行do ../app_debug hello

然后对app_debug.cmm做必要修改,主要是修改任务的调试信息。

Data.LOAD.Elf Z:\applications\hello\&process &spaceid:0 /gnu /nocode /noclear /strippart "/SMDK2410/" /path "Z:\"

           任务级源码调试图         

Display Tasks 可以看到在做好多了一个hello项。

            Display Tasks命令图

 

    不单独发表文章了,就在这里接着写了!下面我在给大家介绍一下uTrace-ICD调试WinCE的具体实现方法。我不是经常写文章,所以文章的组织能力比较差。可能大家想知道的我没写出来或是写的不是很详细,我会慢慢完善,希望能给大家带来帮助。以后我会陆续介绍uTrace-ICD调试VXwork,ucos,uclinux,ecos,nucleus,rtems,symbian等嵌入式操作系统的调试方法。下面就具体介绍WinCE的具体调试方法。

 

 

 

    首先目标板还是选用SMDK2410评估板,上面有移植好的bootloader,如果没有移植好的,可以按上节所介绍的方法用uTrace来调试BootLoader。

 

软件环境的配置:

    安装WinCE开发编译环境Platform Builder。利用Platform Builder 进行WinCE内核配置,裁减,编译生成Eboot.exe 及nk.exe目标文件供uTrace加载。注意:编译时也要将生成调试信息的选项选上。

 

    关于wince的调试的具体实现可参考uTRACE-ICD安装目录\T32\demo\arm\kernel\wince。其下是关于WinCE内核感应的配置文件,还有两个子目录,分别是针对不同的评估板做的示例或范本。要实现在我们自己的目标板上支持WinCE系统的调试,我们自己所要做的工作就是针对自己的目标平台根据\wince目录下的模板修改wince.cmm脚本文件。具体方法可将wince整个目录拷贝到自己的工作目录,然后在其下新建目录,取名为自己的平台,然后将接近自己平台示例目录下的文件完全拷贝到自己新建的文件夹中,然后在对wince.cmm进行必要的修改。

 

如果wince.cmm修改正确,运行cmm脚本将会看到:

               WinCE内核级源码调试图

其中会在主菜单看到增加一个Windows CE菜单项。

               Windows CE 菜单项

子菜单包括WinCE内核的状态信息,有内核进程,线程,内核加载的DLLS以及每个线程堆栈使用情况。

 

1.查看系统中进程

          Display Process菜单项

2.查看系统中线程

         Display threads菜单项

3.查看内核载入的DLLS

         Display Loaded DLL菜单项

4.查看线程堆栈使用情况

         Thread Stacks图

5.查看和修改MMU寄存器

单击ARM主菜单下的MMU Control子菜单,弹出MMU寄存器窗口。

          ARM MMU控制菜单图

6.查看内存映像列表

单击ARM主菜单下的MMU Table List子菜单,弹出内存映像列表窗口。包括逻辑位址到物理位址的映像关系,内存大小,访问权限,以及Cache及写缓冲。

         内存映射列表(即页表)图

 

 WinCE调试的具体实现

 

    首先目标板还是选用SMDK2410评估板,上面有移植好的bootloader,如果没有移植好的,可以按上节所介绍的方法用uTrace来调试BootLoader。

 

软件环境的配置:

    安装WinCE开发编译环境Platform Builder。利用Platform Builder 进行WinCE内核配置,裁减,编译生成Eboot.exe 及nk.exe目标文件供uTrace加载。注意:编译时也要将生成调试信息的选项选上。

 

    关于wince的调试的具体实现可参考uTRACE-ICD安装目录\T32\demo\arm\kernel\wince。其下是关于WinCE内核感应的配置文件,还有两个子目录,分别是针对不同的评估板做的示例或范本。要实现在我们自己的目标板上支持WinCE系统的调试,我们自己所要做的工作就是针对自己的目标平台根据\wince目录下的模板修改wince.cmm脚本文件。具体方法可将wince整个目录拷贝到自己的工作目录,然后在其下新建目录,取名为自己的平台,然后将接近自己平台示例目录下的文件完全拷贝到自己新建的文件夹中,然后在对wince.cmm进行必要的修改。

 

如果wince.cmm修改正确,运行cmm脚本将会看到:

               WinCE内核级源码调试图

其中会在主菜单看到增加一个Windows CE菜单项。

               Windows CE 菜单项

子菜单包括WinCE内核的状态信息,有内核进程,线程,内核加载的DLLS以及每个线程堆栈使用情况。

 

1.查看系统中进程

          Display Process菜单项

2.查看系统中线程

         Display threads菜单项

3.查看内核载入的DLLS

         Display Loaded DLL菜单项

4.查看线程堆栈使用情况

         Thread Stacks图

5.查看和修改MMU寄存器

单击ARM主菜单下的MMU Control子菜单,弹出MMU寄存器窗口。

          ARM MMU控制菜单图

6.查看内存映像列表

单击ARM主菜单下的MMU Table List子菜单,弹出内存映像列表窗口。包括逻辑位址到物理位址的映像关系,内存大小,访问权限,以及Cache及写缓冲。

         内存映射列表(即页表)图

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
lille  2010-03-02 10:43:35 

专业嵌入式开发工具设计,生产,销售.我们提供此产品销售,并诚征有意向代理的合作伙伴:email:sales@ruijitek.com,tel:13917988781 更多资料:www.ruijitek.com

推荐文章
最近访客