诸位大侠,有哪位知道adb的使用?
我看了man adb,对地址中的段地址很是不解,尝试着用
了一些命令,总是提示:bad segment number.
在网上找了一下,很难找到adb的使用说明,所以在此向大伙
寻求帮助,假如能有一个简单的例子(不带源码的obj文档
调试)就更好了。
谢谢! :D
| flybirdxp 回复于:2003-02-28 21:05:30 |
| UNIX系统研发-sdb命令使用:程式执行控制
我们说程式调试的主要目的是观察变量的变化情况。但假如程式就一直不停地运行直至他终止或出错时才停下来的话,将没有机会去观察任何变量。因此,如何有效地控制程式中各语句的执行,使之在适当的时候暂停下来,待调试人员在显示或配置了某些存储单元的值之后再从停下的地方继续执行下去,是调试程式应具备的一项基本功能。在这一节中我们就来具体介绍如何控制程式的运行。 对程式执行控制的第一个问题是配置断点。一个断点实际上就是程式中某行语句。当程式执行到这条语句时控制会重复返回到sdb,由此提供给用户进行其他操作,如显示变量值的机会。 1.断点的配置和删除 在sdb中配置断点的方法比较多。但基本是b命令的变种。例如,我们能够使用如下语句在main()函数的第一个可执行行(非变量定义这类语句)配置一个断点: * main:b 也能够直接用行号来配置断点。例如,在myprog.c中,第10行是main()函数中的第一个可执行语句,则使用如下命令也能达到同样的效果: * 10b 注意这是在myprog.c为当前文档的情况下进行的。 假如直接输入: * b 命令,则可将当前行设成是个断点。但是若当前行不是个可执行语句,那么sdb将把当前行之后的第一个可执行语句处配置一个断点。 在配置完断点之后,为了解程式中配置有哪些断点,能够使用B命令: * B 0x80483f0 myprog.c:10 main 0x8 0x80483f7 myprog.c:11 main 0xf 0x8048407 myprog.c:12 main 0xlf 0x8048440 myprog.c:9 TestInput 0x8048447 myprog.c:10 TestInput 0x7 0x804482 myprog.c:13 TestInput 0x42 在配置完断点之后要将其删除,能够使用d命令。如: * main:d sdb将把在main()函数中配置的第一个可执行行上的断点删除。假如直接使用d命令,sdb将逐个列出任何断点并询问用户是否删除之。回答y断点将被删除。使用D命令则可删除程式中配置的任何断点。 2.sdb中启动程式的运行 在配置好所需的断点之后我们就能够重新启动程式的运行了。这能够使用r命令。如: * r 111 2 BREAKPOINT process 554 function main() in myprog.c 10: for(i=1;i<argc:i ) * sdb将在main()函数中配置第一个断点处停下来并显示该行的语句。r后面给出的是传给可执行程式myprog的两个参数。因此上述命令同在shell提示符下输入: $ myrprog 111 2 是相同的。不同的只是在sdb中程式的执行会在断点处停下来。 假如只输入 * r 命令,sdb使用最近一次执行调试程式时给他提供的参数来启动之。假如想不带任何参数来重新启动程式的运行,可使用 * R 命令。 3.控制程式的单步或连续执行 在用r(R)命令启动程式的运行之后,sdb将在第一个断点处暂停程式的运行。此时断点行成为当前行,但并未被执行。此时我们能够在sdb的星号(*)提示符下输入前面已介绍过的或后面将要介绍的各种命令。当然最重要的是显示那些关键变量的值,以了解程式的运行情况。在这之后便能够继续程式的执行。 继续执行有两种方式。的一种是单步方式,即逐条语句执行。这能够使用S命令完成: * s STEPPED process 584 function main() in myprog.c 14: printf("The %dth value '%s' \tis BAD!\n",i,argv[i]); * sdb在执行完当前语句之后,将当前行后移一行并显示出其代码。对于用户自定义的函数调用,S命令并不将其当成是一条语句,此时他将指示sdb进入该函数(使之成为当前函数)。如我们能够接着上面输入下列命令: * s STEPPED process 584 function main() in myprog.c 11: if(TestInput(argv[i])== TESTOK) * s BREAKPOINT process 594 function main() in myprog.c 11: if(TestInput(argv[i])==TESTOK) * s BREAKPOINT process 584 function TestInput() in myfunc.c 9: {while (* ValueInput)} * s 也能让sdb将用户自定义的函数调用,当成是一条普通语句而不进入此函数的定义。此时能够在那些包含有用户自定义函数调用的行,使用S命令以执行之。 s 和S命令都能够接收一个指明待执行的语句数目的参数。例如: * s 2 使sdb执行当前行及其下那行语句,然后当前行之下的第2行将成为新的当前行。注意当使用s 或S时,假如sdb遇上一个未加-g选项编译的用户自定义函数,那么执行将继续直到一个带-g 选项编译的函数为止。 控制程式执行的第二种是使用c或C命令。一个最简单的c命令将使sdb从当前行把程式执行到下一个断点处。在c命令中还能够临时配置“断点”。例如: * 8c 将使sdb在第8行上配置一个断点并使程式从当前行执行至该断点处后停下来,然后将此断点自动删除并等待用户输入其他命令。 在c命令中还能够指定在继续执行时后面第几个断点处停下来。例如: * c 2 将使sdb从当前行开始执行,直到当前行之后的第2个断点为止。一般的: * c 命令实际上相当于: * c 1 C命令的作用及用法同c基本上是相同的。只但是此时sdb将进程收到的终止信号传给该进程进行处理。这对于调试有软中断处理的进程是很有用的。但sdb并不是将进程所收到的任何信号都传送给进程进行处理。要传递的信号可在sdb的命令行中用-s选项指定。 我们能够用g命令来告诉sdb在给定的行开始继续程式的执行: * 6g 此命令使sdb在当前文档的第6行处恢复执行。而: * 6g2 使sdb在当前文档的第6行恢复执行并跳过两个断点。但在使用g命令时必须小心。假如此命令跳过了那些必须得初始化语句,或进程的执行被恢复到某个并不终止进程的函数中,此时都将会是程式的执行出现人为的差错。一般而言,除非能够确信所跳过的代码段是不正确的代码,不要轻易使用g命令。 4 关联命令 我们能够告诉sdb在使用到某种情况下暂停下来,完成某些操作之后继续执行。例如: * 7b t; i/;c 将使得sdb在当前文档的第7行配置一个断点,然后每当碰到该断点时都显示函数调用栈(t)、变量i的值(i/),并继续程式的执行(c)。 上述命令的一种变化形式是a(Announce命令)。例如: * FunctionName:a 将使得sdb在程式执行过程中每当函数FunctionName被调用时即显示其函数名和参数值。而命令: * FunctionName:6a 将使得sdb在函数FunctionName中的第6行每次被执行时都将其显示出来。 5.函数调用 sdb能够调用程式中用户自定义的任何函数。这种功能对于下面两种情况可能比较有用: 在需要用各种不同的参数对函数进行测试。 用用户自己定义的一个函数来显示程式中的某些数据。 不论是何种情况,我们均能够用如下命令来进行函数调用: * FunctionName(Arg1,Arg2,....) 或 * FunctionName(Arg1,Arg2,....)/m 在第一种用法下,sdb只是简单地执行指定的函数。在第二种用法下,sdb将在执行指定的函数之后显示返回值。此值一般将按十进制方式显示,除非指定了另外的显示格式。 提供给函数的参数能够是寄存器名、整数、浮点数、字符、字符串常量或是其他局部当前函数,或是当前函数能够访问的变量。 6.变量的监控 sdb提供了一种被成为“观察点”(Watch)的机制。借此机制,我们能够监控变量值得变化或某些地址的内容的变化。例如: * i $m 可用于配置对某个变量的观察点。此处变量i为被监控的变量。而用: * 0x00400000:m 则可将地址0x00400000 处配置成观察点,而0x00400000将成为被监控的地址。 在配置了观察点之后,sdb会同处理S命令相同开始程式的单步执行,并在变量的值或指定地址单元的内容被改变时停止程式的执行。由于变量值的改变或地址内容的变化,或其他什么原因而使程式的执行中止,包括因为碰到断点而使程式停止的情形,都将使得所配置的观察点被sdb自动删掉。 被观察的变量必须是当前函数的局部变量或是当前函数所能够访问的变量 其他命令 除了上面介绍的五类主要命令之外,sdb还支持其他一些命令。使用这些命令,能够完成其他一些辅助性的工作。分别介绍如下。 . !Shell Command 此命令能够使sdb去执行指定的Shell Command。这里Shell Command是个合法命令。例如能够输入: * ! ls -l sdb将执行指定的ls -l 命令,并将其输出显示出来。 使用: * ! sh 能够生成一个新的Shell进程。在此新的Shell中能够完成某些工作,然后用exit命令返回到sdb中。 <FileName 指示sdb从文档FileName中读取sdb调试命令,并且逐个执行之。 "SomeString 指示sdb显示出某个字符串。常用此命令给出某些提示信息, k 此命令将使当前对程式的调试终止,之后仍可用r命令重新启动被调试的程式。如: * k 1111:killed * 这里1111是被调试进程的进程号。 * q 此命令将使sdb停止其自身的运行而返回至原Shell提示符下。在调试完程式之后一般都要使用此命令。
文章整理:西部数码--专业提供域名注册、虚拟主机服务 相关文章
热点关注
IDC资讯
虚拟主机
域名注册
托管租用
vps主机
智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源 网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧 行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒 网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它 服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护 软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer 网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash 程序设计 Java技术 C/C++ VB delphi 网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术 操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD |



