﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-龙人嵌入式系统开发和ODM研发-文章分类-ARM9开发板和ARM7开发板-嵌入式开发</title><link>http://www.blogjava.net/armodmlr/category/29807.html</link><description>龙人嵌入式系统开发和ODM研发—arm9开发板和arm7开发板</description><language>zh-cn</language><lastBuildDate>Thu, 05 Nov 2009 18:55:55 GMT</lastBuildDate><pubDate>Thu, 05 Nov 2009 18:55:55 GMT</pubDate><ttl>60</ttl><item><title>解析基于ELF的嵌入式软件源码级交叉调试技术</title><link>http://www.blogjava.net/armodmlr/articles/299814.html</link><dc:creator>龙人嵌入式开发</dc:creator><author>龙人嵌入式开发</author><pubDate>Mon, 26 Oct 2009 09:31:00 GMT</pubDate><guid>http://www.blogjava.net/armodmlr/articles/299814.html</guid><wfw:comment>http://www.blogjava.net/armodmlr/comments/299814.html</wfw:comment><comments>http://www.blogjava.net/armodmlr/articles/299814.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/armodmlr/comments/commentRss/299814.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/armodmlr/services/trackbacks/299814.html</trackback:ping><description><![CDATA[<sup><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">开发任何一个软件都不可避免地存在各种错误，要修正错误必须找出其错误原因。通常程序员利用调试器来跟踪程序执行情况，快速有效地定位错误产生的位置从而找到引起错误的原因，并改正错误。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　调试器为用户提供的主要功能包括：在目标程序中设置、删除断点；以单步执行或连续执行等方式控制目标程序运行；浏览程序中的变量或表达式的值；查看、修改目标机寄存器的内容；查看、修改目标机内存的内容。源码级调试器是面向高级语言的符号调试工具，它基于源代码的语句和符号跟踪观察目标程序，同时提供基于汇编级的程序跟踪功能以满足用户底层的调试需要。通用计算机软件一般在同一台机器上进行编辑、编译、调试；而嵌入式软件的目标系统多为特殊的专用系统，通常采用宿主机</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">/</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">目标机开发环境，借助通用计算机作为编辑源文件的宿主机，利用交叉编译器在宿主机上编译生成目标机的可执行代码，调试时通过通讯介质（串线或网络）将目标代码下载到目标系统上运行，利用交叉调试器进行跟踪调试。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　一、源码级交叉调试器的实现途径</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　程序运行过程中目标程序的指令代码和数据都映射到目标机上相应的内存内容，为了实现源码级调试，利用目标文件中在程序编译链接时生成的调试信息来实现目标程序与源程序之间的映射，从而在源码级实现对程序执行情况的控制和观察。其关键在于找到调试控制点和数据在源程序与目标程序之间的映射关系。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　任何数据都有名和值两个侧面，数据名与数据值之间的映射关系为：根据数据名得到存放该数据值的内存地址，再从目标机的内存地址取出其内容即为数据值：</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　调试中的程序控制点通常为源程序中的函数、语句行等，它们对应于装载到目标内存中的相应目标代码，要实现程序的运行控制关键在于得到源代码与目标代码之间的映射关系：由源码定位信息得到相应的目标码信息；由目标码地址得到相应的源码定位信息。源码定位信息为源文件名</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">+</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">行号或函数名；目标码信息为目标指令在目标机内存中的起始和终止地址。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　<strong><a href="http://www.armodm.com/arm_oem/arm.asp">嵌入式软件</a></strong>以宿主机</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">/</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">目标机模式开发，其交叉调试器分为宿主机部分和目标机部分，两者以统一的通讯协议进行通信，宿主机向目标机发送命令，目标机接收、执行命令并将结果返回宿主机，从而实现两机之间的交互控制。免费软件基金会</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">FSF</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">提供的调试工具</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">gdb</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">具有一套比较成熟的通讯协议</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">----remote</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">通讯协议，该协议作为开放软件被广为采用，在此我们选择了</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">rmote</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">协议作为交叉调试器的远程通讯协议。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　二、</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">ELF</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">格式目标文件</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　目标文件是实现源码级调试的基础，需要详细分析文件的格式及内容以从中获取有用的调试信息。在设计调试器时采用可执行连接格式</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">――ELF</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">格式目标文件作为开发基础，</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">ELF</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">（</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">Executable and Linking Format</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">）是</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">UNIX</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">系统实验室</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">(USL)</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">作为应用程序二进制接口（</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">Application Binary Interface</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">（</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">ABI</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">））而开发和发布的，已被软件业广泛采用，在</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">Linux</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">系统中</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">ELF</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">格式是其默认的目标文件格式，许多嵌入式软件都采用</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">ELF</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">格式作为目标文件格式。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">ELF</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">目标文件主要有三种类型：可重定位文件，可执行文件，共享的目标文件，我们以可执行文件为分析对象。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">ELF</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">头固定在文件的起始位置，其它各部分的位置由</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">ELF</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">头及其它相关信息获得。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">1</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">、</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">ELF</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">头</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">ELF</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">头是整个文件的入口，具有固定的长度，</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">52</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">个字节，包含</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">14</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">个值。包括</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">ELF</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">文件标识，程序头表和节头表的位置、长度，文件中段的数目和节的数目等信息。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">2</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">、程序头表与段</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　程序头表中有多个表项，每个表项是一个程序段的信息，固定长度为</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">32</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">个字节，包含</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">8</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">个值，包括段在文件中的位置，段在内存中的起始虚拟地址，段的长度及其它属性等。调试器根据程序头表中的信息来确定需要下载到目标机上的目标文件内容</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">(</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">指令与数据</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">)</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">及其在目标机中的内存地址。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">3</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">、节头表与节</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　节头表中也有多个表项，每个表项是一个节的信息，固定长度为</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">40</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">个字节，包含</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">10</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">个值，包括节名、节的类型、该节在文件中的位置、该节在内存中的起始地址（如果该节出现在内存映象中）、节的长度等信息。某些节是程序段的组成部分，如包含程序二进制指令代码的正文节</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">.text</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">和数据节</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">.rodata,.hash</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">等，某些节不作为段的组成部分，只提供其它的额外信息。为源码调试服务的有</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"> .debug</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">，</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">.line</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">，</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">.symtab</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">，</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">.debug_ pubname</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">，</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">.debug_range</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">等节，其中</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">.debug, .line</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">节包含了源码调试信息的基本内容。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">.debug</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">节中有多种类型的记录，可分为几大类：</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　（</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">1</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">）、编译模块信息：包含组成该文件的各个模块的源文件名，路径，及该模块的代码地址范围等。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　（</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">2</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">）、子程序信息：包含程序名，程序类型，起始终止地址，程序返回结果存放地址等。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　（</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">3</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">）、变量信息：包含变量名、变量类型、变量存放地址信息等，变量有多种类型，简单变量、结构变量等类型的变量其信息内容各有不同。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　将</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">.debug</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">节中各项内容的结构关系抽象为家族关系。以节的起始为根，首先是一个编译单元的信息，它给出下一个编译单元（兄弟关系）在文件中的相对位置。紧跟着编译单元的是该编译单元中的子程序与公共变量信息（父子关系），同样的，编译单元中头一个函数记录或变量记录将给出它的兄弟的位置信息。紧随该函数记录的是该函数内部的子程序与局部变量信息。相邻层次成员是父子关系，同一层次上的成员是兄弟关系，如图</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">4</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">所示：</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">.line</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">节中包含目标代码地址与源代码行号之间的对应关系。对每个编译单元给出其行记录信息的长度和目标码的起始基地址，以及该编译单元中所有的行记录，每条记录以固定的格式表示：</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">&#8220;</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">该行目标码相对于基地址的偏移，列号（保留，暂未使用），行号</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">&#8221;</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　综合上述程序段和节的内容，即可确定源码与目标码的映射关系。如给定一个文件名及行号，确定其目标代码的信息。首先根据文件名确定其在</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">.debug</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">节中的编译模块信息，从中可得该文件模块的起始终止地址；再由其起始地址找到该编译模块的行记录信息在</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">.line</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">节中的位置，根据行号找到行记录，得到该行目标码的地址范围；由这些地址信息，可直接从目标机内存中取得目标代码，也可结合程序段信息从目标文件的程序段中取得该行所对应的目标代码指令内容。调试器利用地址与指令信息就可以查看、修改、执行相应目标代码，供用户进行调试。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　三、源码级交叉调试器实现的技术要点</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　在设计交叉调试器</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">JDBG</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">时，首先完成与目标文件无关的部分：连接目标机，查看修改目标机寄存器和内存；然后实现与目标文件有关的部分：下载目标文件到目标机，源码级调试功能，包括断点控制、执行控制、变量观察等，以下重点讨论各项功能的设计与实现。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">1</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">、</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">&nbsp; </span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">下载目标文件</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　目标文件中包含多种类型的内容，目标程序在目标机上运行时只需要程序的二进制指令代码与相关数据，这些内容包含在文件中的可执行程序段中。下载目标文件时在宿主机上提取目标文件中的代码与数据段，根据其地址映射关系利用</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">remote</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">协议中写内存的功能在目标机上建立程序的远程映像。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">2</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">、</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">&nbsp; </span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">断点</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　断点是调试器控制程序执行的基本手段。各种机器有其特殊的断点指令</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">(</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">如</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">X86</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">的</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">int3</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">指令</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">)</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">，设置断点就是将机器断点指令替换所指定程序单元中的指令，使得程序运行到断点指令处时，产生</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">&#8220;</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">断点异常</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">&#8221;</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">，用户程序不再继续执行下去，目标机向宿主机返回断点停止信号，由宿主机调试器接管对用户程序的控制。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　断点分为逻辑断点与物理断点，两者是多对一的关系。逻辑断点与源代码对应，提供源级断点信息</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">(</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">源文件名</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">+</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">行号或物理地址等</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">)</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">；物理断点与目标码对应，提供断点的目标码地址及断点处的指令内容。插入一个断点即根据逻辑断点信息确定物理断点地址，将该地址对应指令用机器断点指令替代；删除断点即恢复断点指令处预先保存的原指令，使得程序可继续执行。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　检查点是一种条件断点，使程序在条件满足时停止执行。通常条件都涉及表达式的值变化，利用写内存保护来检查表达式的值是最常用的方法，但这种方法不适用于不具备</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">MMU</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">功能的处理器。某些处理器</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">(</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">如</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">i386)</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">提供了专门的调试控制寄存器，通过在调试控制寄存器中设置相应线性地址及中止条件</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">(</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">读或写</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">)</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">即可中止程序的运行。通过查询方式检查表达式的值也是一种可行的方法，其效率相对较低。当检查点的条件满足时，检查点的操作与普通断点类似。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　对一个断点应具有基本的插入、删除、使能、使不能等基本操作功能。在设计中采用双向链表结构作为断点的数据结构，使得断点控制更加方便高效。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">3</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">、</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">&nbsp; </span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">启动程序运行</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　启动程序运行首先从目标文件的</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">ELF</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">头中得到应用程序的入口，将目标机的</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">PC</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">寄存器置为该入口地址，从入口处开始执行程序指令。如果程序中没有设置任何断点或检查点，则程序一直运行到结束；如果程序中有断点，则程序运行到第一个断点处停止并返回其停止位置。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">4</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">、</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">&nbsp; </span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">源码级单步调试</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　源码级单步以行为单位，一行源代码对应多条机器指令，因此一个源语句的单步执行需要多个机器指令的单步执行。最简单的实现方法就是从源语句对应目标代码的起始地址开始逐条单步执行机器指令。显然这种方法效率很低，尤其调试嵌入式软件需要大量宿主机</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">/</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">目标机间的通讯，而且有的处理器自身并不提供机器单步执行指令。因此，更有效的方法是用</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">&#8220;</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">内部临时断点＋连续执行</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">&#8221;</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">的方式来实现。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　用机器单步执行时，每执行完一条机器指令立即读取当前</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">PC</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">，判断程序停止位置。调试器对程序的控制是即时交互的，当单步执行结束、跳转或进入函数调用时，调试器都会即时得知。不采用机器单步，则不具有这种即时掌握程序运行状态的便利，需要在运行前反汇编目标代码，通过分析汇编指令预测程序单步执行可能的出口位置，并在该处设上断点。可能的出口位置包括该行指令的终止地址、跳转、分枝跳转、函数调用等指令。对于跳转指令，能得到绝对地址则直接在跳转地址处设断点，不能得到跳转地址则在指令处设断点，再执行跳转指令由当前</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">PC</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">值确定程序停止的位置。对于函数调用指令，如果采用单步跳过（</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">stepover</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">）方式，则将其作为普通指令看待，直接执行调用函数；如果采用单步进入（</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">stepinto</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">）方式，则需在指令处设断点，再执行调用指令，以进入函数内部让用户继续跟踪程序的执行。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　以单步跳出方式（</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">stepout</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">）执行程序时，以子程序为单位，需执行完当前子程序的所有代码，在调用该子程序的下一条语句处停止。通过反汇编当前子程序的所有指令，可得到该子程序所有可能的函数返回出口，在这些函数返回指令处设临时断点，程序运行到断点处再执行该返回指令跳出当前子程序，处理调用该子程序的语句行的后继信息，最终确定程序停止位置。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">5</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">、数据浏览</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　数据与指令同样是构成程序的根本。数据类型繁多，不同的类型处理起来有所不同，其基本原理是由数据名找到存放该数据的地址，再从地址中取出数据的值。关键在于找到名与地址的映射关系。这些信息可从</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">.debug</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">，</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">.symtab</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">等节中得到。全局变量一般可得到直接的地址信息，而局部变量采用堆栈方式存放在内存中，需根据从</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">.debug</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">中得到的该变量在堆栈中的位置信息来确定地址。采用表结构来管理变量，将每个变量的名、地址等信息登记在表中，将对数据值的操作转化为对相应地址的内存单元操作，如查看变量即为读取该变量所在内存单元的内容。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　四、交叉调试器</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">JDBG</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">简述</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
<p style="line-height: 16.5pt"><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">JDBG</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">采用图形用户界面，相应的命令提供图形按钮或菜单，并提供快捷键。进入调试之前，先连接目标机，在连接时设置连接参数并保存，在以后的连接中可直接使用已保存的设置参数。当宿主机</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">/</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">目标机处于连接状态时，下载目标文件，启动调试器。调试器启动后，用户可在打开的源文件中设置断点，运行下载的目标程序，查看</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial">/</span><span style="font-size: 10.5pt; color: #333333; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">修改寄存器、内存的内容。当运行的目标程序停止后，返回停止点源码信息，用户可以观察数据，添加新的断点或删除已设断点，控制程序的单步执行或连续执行，或退出调试状态。</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Arial"><o:p></o:p></span></p>
</sup>
<img src ="http://www.blogjava.net/armodmlr/aggbug/299814.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/armodmlr/" target="_blank">龙人嵌入式开发</a> 2009-10-26 17:31 <a href="http://www.blogjava.net/armodmlr/articles/299814.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ARM9和ARM7教学平台分析-龙人嵌入式系统教学</title><link>http://www.blogjava.net/armodmlr/articles/183145.html</link><dc:creator>龙人嵌入式开发</dc:creator><author>龙人嵌入式开发</author><pubDate>Sat, 01 Mar 2008 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/armodmlr/articles/183145.html</guid><wfw:comment>http://www.blogjava.net/armodmlr/comments/183145.html</wfw:comment><comments>http://www.blogjava.net/armodmlr/articles/183145.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/armodmlr/comments/commentRss/183145.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/armodmlr/services/trackbacks/183145.html</trackback:ping><description><![CDATA[<p class="0" style="layout-grid-mode: char; text-align: justify"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">&nbsp; </p>
<div class="Section0">
<p class="0" style="layout-grid-mode: char; text-align: justify"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">ARM9<font face="宋体">和ARM7教学平台分析-龙人嵌入式系统教学</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">文章整理：</font></span><span><a href="http://www.armodm.com/"><span class="15" style="font-size: 10pt; color: rgb(0,0,255); font-family: 'Times New Roman'; text-decoration: underline; mso-spacerun: 'yes'"><font face="宋体">龙人嵌入式系统开发部</font></span></a></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">（</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">armodmlr</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">）</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">目前</font></span><span><a href="http://armodmlr.applegold.com.cn/"><span class="15" style="font-size: 10pt; color: rgb(0,0,255); font-family: 'Times New Roman'; text-decoration: underline; mso-spacerun: 'yes'"><font face="宋体">嵌入式系统教学</font></span></a></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">平台市场上的主导产品都是基于</font></span><span><a href="http://armodmlr.zhan.cn.yahoo.com/"><span class="15" style="font-size: 10pt; color: rgb(0,0,255); font-family: 'Times New Roman'; text-decoration: underline; mso-spacerun: 'yes'">ARM7</span></a></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">或ARM9架构的，一般都认为ARM7属于低端产品、</font></span><span><a href="http://armodmlr.anytome.com/"><span class="15" style="font-size: 10pt; color: rgb(0,0,255); font-family: 'Times New Roman'; text-decoration: underline; mso-spacerun: 'yes'">ARM9</span></a></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">属于高端产品，也出现了所谓的&#8220;ARM7&amp;ARM9覆盖高端&amp;低端的教学平台&#8221;。宣传&#8220;两套&nbsp;CPU&nbsp;子板都是可以自由插拔，一套实验系统变化为两套，&nbsp;ARM7&nbsp;的实验系统可以实现基础的&nbsp;ARM&nbsp;嵌入式教学，主要包括指令实验，基础接口实验，&nbsp;UCOS-II&nbsp;操作系统实验和&nbsp;uCLinux&nbsp;操作系统实验；ARM9&nbsp;的实验系统可以实现高端的&nbsp;ARM&nbsp;</font></span><span><a href="http://hexun.com/armodmlr"><span class="15" style="font-size: 10pt; color: rgb(0,0,255); font-family: 'Times New Roman'; text-decoration: underline; mso-spacerun: 'yes'"><font face="宋体">嵌入式开发</font></span></a></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">教学，主要包括扩展接口实验，&nbsp;Linux&nbsp;操作系统实验和&nbsp;WinCE&nbsp;操作系统实验&#8221;。这种观点有误导用户的嫌疑。因为</font></span><span><a href="http://blog.tom.com/armodmlr/"><span class="15" style="font-size: 10pt; color: rgb(0,0,255); font-family: 'Times New Roman'; text-decoration: underline; mso-spacerun: 'yes'">ARM9<font face="宋体">和ARM7</font></span></a></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">同属于ARMv41，是属于中低端系列的ARM微处理器。目前市场上真正高端的ARM架构处理器是与ARMV5TE体系兼容的Intel&nbsp;XScale，如PXA255和PXA270。针对以上情况，</font></span><span><a href="http://www.armodm.com/"><span class="15" style="font-size: 10pt; color: rgb(0,0,255); font-family: 'Times New Roman'; text-decoration: underline; mso-spacerun: 'yes'"><font face="宋体">龙人计算机</font></span></a></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">（嵌入式系统开发公司，同时是</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">ARM<font face="宋体">开发板和</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">ARM<font face="宋体">开发工具提供商）在此分析</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">&nbsp;ARM9<font face="宋体">和ARM7教学平台。</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">ARM9&nbsp;ARM7&nbsp;<font face="宋体">嵌入式系统&nbsp;</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">嵌入式开发&nbsp;</font></span><span><a href="http://hi.baidu.com/armodmlr"><span class="15" style="font-size: 10pt; color: rgb(0,0,255); font-family: 'Times New Roman'; text-decoration: underline; mso-spacerun: 'yes'">ARM9<font face="宋体">教学平台</font></span></a></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font face="宋体">从嵌入式系统开发教学平台的发展来看，未来会形成两个发展方向。即一方面向高端的XScale系列发展，主要面向计算机、软件等专业，这一类高端平台具有强大的计算能力和多媒体功能，教学内容侧重于操作系统、驱动程序和软件应用，培养消费电子、手持设备、无线网络、手机游戏等领域的嵌入式软件开发人才；另一方面就是中低端的ARM7/ARM9系列教学平台，主要面向电子工程、自动化、仪器仪表等专业，这类平台具有丰富的接口和功能，教学内容侧重于微处理器接口设计、驱动开发和系统应用，培养工业自动化、测控、智能仪表等应用领域的嵌入式技术人才。&nbsp;</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font face="宋体">由此可见，仅仅一个ARM9教学平台就可以同时满足中低端教学的需求，额外添加ARM7去满足低端教学任务，只能认为是画蛇添足。平白增添了硬件成本，还限制了硬件平台的扩展。&nbsp;嵌</font></span><span><a href="http://armodmlr.blog.china.alibaba.com/"><span class="15" style="font-size: 10pt; color: rgb(0,0,255); font-family: 'Times New Roman'; text-decoration: underline; mso-spacerun: 'yes'"><font face="宋体">入式系统教</font></span></a></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">学的目的应该是为了让学生学到一种嵌入式平台开发和设计的方法，其变化主要体现在运行不同操作系统上，而不是硬件是否采用ARM7还是ARM9上。教学思想应是&#8220;授人以渔&#8221;，学生学到的是设计方法，将来不管是ARM7，&nbsp;ARM9，还是XScale，甚至包括MIPS、alpha、68k、powerpc等其它体系结构的微处理器，对于一个优秀的嵌入式系统工程师来说都是一样的。</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: '宋体'; mso-spacerun: 'yes'">深圳龙人嵌入式系统开发有限公司提供的嵌入式开发板有ARM系列开发板(</span><span><a href="http://armodmlr.blog.sohu.com/"><span class="15" style="font-size: 10.5pt; color: rgb(0,0,255); font-family: '宋体'; text-decoration: underline; mso-spacerun: 'yes'">ARM9开发板</span></a></span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: '宋体'; mso-spacerun: 'yes'">和ARM7开发板)、</span><span style="font-weight: normal; font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">ColdFire<font face="宋体">系列开发板</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">、</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">ColdFire<font face="宋体">系列开发板</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">、</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">ADSP<font face="宋体">系列开发板</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">、</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">MIPS<font face="宋体">系列开发板</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">及</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">达芬奇系列开发板</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">。</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">网址：</font></span><span><a href="http://www.armodm.com/"><span class="15" style="font-size: 10pt; color: rgb(0,0,255); font-family: '宋体'; text-decoration: underline; mso-spacerun: 'yes'">http://www.armodm.com</span></a></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
</div>
<p class="0" style="layout-grid-mode: char; text-align: justify"><!--endfragment--></span></p>
<!--endfragment-->
<img src ="http://www.blogjava.net/armodmlr/aggbug/183145.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/armodmlr/" target="_blank">龙人嵌入式开发</a> 2008-03-01 15:52 <a href="http://www.blogjava.net/armodmlr/articles/183145.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>嵌入式系统开发设计的核心技术——设计/验证技术 </title><link>http://www.blogjava.net/armodmlr/articles/183144.html</link><dc:creator>龙人嵌入式开发</dc:creator><author>龙人嵌入式开发</author><pubDate>Sat, 01 Mar 2008 07:49:00 GMT</pubDate><guid>http://www.blogjava.net/armodmlr/articles/183144.html</guid><wfw:comment>http://www.blogjava.net/armodmlr/comments/183144.html</wfw:comment><comments>http://www.blogjava.net/armodmlr/articles/183144.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/armodmlr/comments/commentRss/183144.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/armodmlr/services/trackbacks/183144.html</trackback:ping><description><![CDATA[&nbsp;
<div class="Section0">
<p class="0" style="layout-grid-mode: char; text-align: justify"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">嵌入式系统开发设计的核心技术——设计/验证技术&nbsp;</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">　　嵌入式系统的设计技术主要包括硬件设计技术和软件设计技术两大类。其中，硬件设计领域的技术主要包括芯片级设计技术和电路板级设计技术两个方面。&nbsp;</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">　　芯片级设计技术的核心是编译/综合、库/IP、测试/验证。编译/综合技术使设计者用抽象的方式描述所需的功能，并自动分析和插入实现细节。库/IP技术将预先设计好的低抽象级实现用于高级。测试/验证技术确保每级功能正确，减少各级之间反复设计的成本。</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">软件设计技术的核心是软件语言。软件语言经历了从低级语言（机器语言、汇编语言）到高级语言（如结构化设计语言、面向对象设计语言）的发展历程，推动其发展的是汇编技术、分析技术、编译/解释技术等诸多相关技术。软件语言的级别也从实现级、设计级、功能级逐渐向需求级语言发展过渡。&nbsp;</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font face="宋体">早期，随着通用处理器概念的逐渐形成，软件技术迅速发展，软件的复杂度也开始增加，软件设计和硬件设计的技术和领域完全分开。设计技术和工具在这两个领域同步得到发展，也使得行为描述可以在越来越抽象的级别上进行，以适应设计复杂度不断增长的需要。这种同步发展如今又使得这两领域都在使用同样的时序模型来描述行为，因而这两领域再度统一为一个领域即将成为可能。</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
</div>
<!--endfragment-->
<img src ="http://www.blogjava.net/armodmlr/aggbug/183144.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/armodmlr/" target="_blank">龙人嵌入式开发</a> 2008-03-01 15:49 <a href="http://www.blogjava.net/armodmlr/articles/183144.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java实现利用搜索引擎收集网址的程序 </title><link>http://www.blogjava.net/armodmlr/articles/183142.html</link><dc:creator>龙人嵌入式开发</dc:creator><author>龙人嵌入式开发</author><pubDate>Sat, 01 Mar 2008 07:45:00 GMT</pubDate><guid>http://www.blogjava.net/armodmlr/articles/183142.html</guid><wfw:comment>http://www.blogjava.net/armodmlr/comments/183142.html</wfw:comment><comments>http://www.blogjava.net/armodmlr/articles/183142.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/armodmlr/comments/commentRss/183142.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/armodmlr/services/trackbacks/183142.html</trackback:ping><description><![CDATA[<table class="blog-content">
    <tbody>
        <tr>
            <td>
            <p>我这里讲的不是怎么使用搜索引擎，而是怎么让程序利用搜索引擎来搜集网址，这有什么用？很有用！网上动辄有人叫卖网址数据库，如发布软件网址、邮件地址、论坛网址、行业网址，这些网址是怎么来的呢？不可能是人手工收集而来的，都是让程序利用搜索引擎取到的，如果您需要某类网址信息数据，就跟我来一起研究一下，非常简单。
            <p>　　本文采用Java语言写成，以google和百度搜索引擎为对象。</p>
            <p>　　我们要利用google、百度搜索引擎的搜索规则中的两条，关键字搜索和inurl搜索。什么是inurl搜索，就是你所要搜索的网址中本身带有的关键字，比如<a href="http://www.armodm.com">http://www.armodm.com</a> ,这个网址就含有post.asp这样的关键字，在搜索引擎中填写规则是 inurl:post.asp,这是收集网址的关键，因为很多网址本身会带有特定的信息，比如软件发布的网页网址信息中多含有 publish、submit、tuijian这样的信息，如<a href="http://www.armodm.com">http://www.armodm.com</a>,这样的网址多是发布信息的网页，在结合网页中本身可能含有的关键字，就可以用搜索引擎搜索出结果，然后我们利用程序将结果取回，对HTML页面进行分析，去除没有用的信息，将有用的网址信息写入文件或者数据库，就可以给其它应用程序或者人来使用了。</p>
            <p>　　第一步，用程序将搜索结果取回，先以百度为例，比如我们要搜索软件发布的网页，关键字采用 &#8220;软件发布 版本 inurl:publish.asp",先登录百度看看，将关键字写入，然后提交，在地址栏就会看到 <a href="http://www.baidu.com/s?ie=gb2312&amp;bs=%C8%ED%BC%FE%B7%A2%B2%BC+%C8%ED%BC%FE%B0%E6%B1%BE+inurl%3Apublish.asp&amp;sr=&amp;z=&amp;cl=3&amp;f=8&amp;wd=%C8%ED%BC%FE%B7%A2%B2%BC+%B0%E6%B1%BE+inurl%3Apublish.asp&amp;ct=0" target="_blank">http://www.baidu.com/s?ie=gb2312&amp;bs=%C8%ED%BC%FE%B7%A2%B2%BC+%C8%ED%BC%FE%B0%E6%B1%BE+inurl%3Apublish.asp&amp;sr=&amp;z=&amp;cl=3&amp;f=8&amp;wd=%C8%ED%BC%FE%B7%A2%B2%BC+%B0%E6%B1%BE+inurl%3Apublish.asp&amp;ct=0</a> ,中文关键字全都变成编码了，没有关系，我们在程序中直接用中文也是可以的，其中多个关键字用＋号相连，去掉一些没有用的信息，我们可以把地址优化成 <a href="http://www.baidu.com/s?lm=0&amp;si=&amp;rn=20&amp;ie=gb2312&amp;ct=0&amp;" target="_blank">http://www.baidu.com/s?lm=0&amp;si=&amp;rn=20&amp;ie=gb2312&amp;ct=0&amp;</a> wd=软件发布+版本+inurl%3Apublish%2Easp&amp;pn=0&amp;cl=0，其中rn表示一页显示多少个结果，wd=表示你要搜索的关键字，pn表示从第几条开始显示，这个pn将是我们程序循环取结果的变量，每20条循环一次。我们用Java写的程序来模拟这个搜索的过程，用到的关键类为 java.net.HttpURLConnection,java.net.URL，先写一个提交搜索的class,关键代码如下：</p>
            <p>class Search<br />
            {<br />
            　public URL url;<br />
            　public HttpURLConnection http;<br />
            　public java.io.InputStream urlstream;<br />
            　......<br />
            　for(int i=0;i++;i &lt;100)<br />
            　{<br />
            　　......<br />
            　　try {<br />
            　　　url = new URL("www.baidu.com/s?lm=0&amp;si=&amp;rn=20&amp;ie=gb2312&amp;ct=0&amp; wd=软件发布+版本+inurl%3Apublish%2Easp&amp;pn="+beginrecord+"&amp;cl=0");<br />
            　　}catch(Exception ef){};<br />
            　　try {<br />
            　　　http = (HttpURLConnection) url.openConnection();<br />
            　　　http.connect();<br />
            　　　urlstream = http.getInputStream();<br />
            　　}catch(Exception ef){};<br />
            　　java.io.BufferedReader l_reader = new java.io.<br />
            　　BufferedReader(new java.io.InputStreamReader(urlstream));<br />
            　　try {<br />
            　　　while ((currentLine = l_reader.readLine()) != null) {<br />
            　　　　totalstring += currentLine;<br />
            　　　}<br />
            　　} catch (IOException ex3) {}<br />
            　　....<br />
            　　//本次搜索的结果已经放到totalstring中了，是一些HTML代码，需要下一步进行分析了。<br />
            }<br />
            　　再以google为例，稍微有些不同，google对浏览器进行了一些检测，编码也不同，URL为http: //www.google.com/search?q=软件发布+版本+inurl:publish.asp&amp;hl=zh-CN&amp;lr= &amp;newwindow=1&amp;start=0&amp;sa=N&amp;ie=UTF-8,其中编码要用ie=UTF-8,start表示从第几条记录显示，需要注意的是google对浏览器还要检查，如果浏览器不符合它的要求，将返回错误代码，所以在模拟浏览器提交中，我们要多加一行代码，修改关键部分要将http属性中的User-Agent设置为常用的浏览器，比如Mozilla/4.0,代码如下：</p>
            <p>try {<br />
            　http = (HttpURLConnection) url.openConnection();<br />
            　http.setRequestProperty("User-Agent", "Mozilla/4.0");<br />
            　http.connect();<br />
            　urlstream = http.getInputStream();<br />
            }catch(Exception ef){};</p>
            <p>　　第二步，对取回的HTML编码进行分析，取出其中的有用网址信息，并写入文件或者数据库，由于这些搜索引擎都有网页快照和相似网页等网址信息混杂在HTML中，我们要将这些网址信息剔除掉，剔除的关键就是找出其中的规律，百度搜索引擎中的网页快照和其它没有用的的地址都含有baidu这个关键字，而google中含有的无用网址信息含有关键字 google和cache,我们就根据这些关键字剔除无用网址信息。在Java中要对字符串进行分析必然要用到 java.util.StringTokenize这个类，用来将字符串以特定的分隔符分开，java.util.regex.Pattern和 java.util.regex.Matcher用来匹配字符串，关键代码如下：</p>
            <p>class CompareStr<br />
            {<br />
            　public boolean comparestring(String oristring,String tostring)<br />
            　{<br />
            　　Pattern p=null; //正则表达式<br />
            　　Matcher m=null; //操作的字符串<br />
            　　boolean b;<br />
            　　p = Pattern.compile(oristring,Pattern.CASE_INSENSITIVE);<br />
            　　m = p.matcher(tostring);<br />
            　　b = m.find();<br />
            　　return b;<br />
            　}<br />
            }</p>
            <p>class AnalyUrl<br />
            {<br />
            　......<br />
            　StringTokenizer token = new StringTokenizer(totalstring," &lt;&gt; \"");<br />
            　String firstword;<br />
            　CompareStrcompstr = new CompareStr();<br />
            　String dsturl = null;<br />
            　while (token.hasMoreTokens())<br />
            　{<br />
            　　firstword = token.nextToken();<br />
            　　if (!compstr.comparestring("google.com", firstword) &amp;&amp; !compstr.comparestring("cache",firstword))<br />
            　　{<br />
            　　　if (firstword.length() &gt; 7)<br />
            　　　{<br />
            　　　　dsturl = firstword.substring(6,firstword.length() - 1);<br />
            　　　　WriteUrl(dsturl); //成功取到URL，记录到文件中<br />
            　　　}<br />
            　　}<br />
            　}<br />
            }<br />
            　　通过以上程序，我们就可以收集到自己要的网址信息了，还可以再写另外一个应用程序，对收集到的网址信息进一步分析，取出自己需要的信息，这里就不再累赘，道理都是一样的。最后需说明一点，google搜索引擎搜索所能返回的结果不能超过1000条，过了1000条，就直接提示&#8220;对不起， Google 为所有查询的结果数都不会超过 1000 个。&#8221;，百度搜索引擎返回的结果不能超过700多条，所以我们要搜索时尽可能多加关键字，将结果范围缩小。</p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/armodmlr/aggbug/183142.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/armodmlr/" target="_blank">龙人嵌入式开发</a> 2008-03-01 15:45 <a href="http://www.blogjava.net/armodmlr/articles/183142.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>