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

命令。

时间: 2024-11-01 02:03:53

UNIX系统管理:sdb命令使用-程序执行控制的相关文章

UNIX系统管理:动态链接程序程序搜索目录

在采用动态链接方式对程序进行编译,链接时候.链接程序只是在最终的可执行文件中记录下关于所引用的共享库中的符号的一些登记信息,以便在程序被执行时,动态链接程序能够根据这些登记信息找到相应的代码.因此登记动态链接方式而言,除了在链接阶段涉及到对库文件的搜索路径外,还有一个在程序运行阶段对库文件的搜索问题. 前一个问题我们知道借助于LD_LIBRARY_PATH环境变量及cc命令行中的-L选项已经得到了比较好的解决.对于第二个问题,我们必须提供一种机制,使得动态链接程序能够找到相应的动态库,然后才能将

json-java程序执行linux命令;;;求大神啊+++++++++++++

问题描述 java程序执行linux命令:::求大神啊+++++++++++++ java程序执行linux命令,按照三个条件查询service.log里信息 如何实现啊 时间条件是每天的log日期,waybillNo,opOrgCode 日志里每条记录是一串json {"pdaUuid":"f2b0fa0db0e749a0959ad22620cb06c4","goodsType":"","effectiveType

UNIX系统管理:sdb命令使用-源程序的显示和搜索

sdb命令的使用 同我们前面介绍过的mail,ftp一类工具类似,sdb也是一个命令解释程序.也就是说,用户在sdb提示符(一个星号*)下输入sdb能够识别的命令,sdb将根据被调试的程序的具体情况给出响应. 例如,在运行myprog出错,生成core文件之后进入sdb时,sdb将给出如下的响应: $ sdb myprog 12: return ((100/atoi(ValueInput))? TESTOK:! TESTOK); * sdb给出来的实际上是程序出错所在的函数,在源程序文件中的行号

UNIX系统管理:程序调试概述

对任何http://www.aliyun.com/zixun/aggregation/7298.html">程序开发而言,程序的调试都是开发过程中的一个重要阶段.程序调试的目的就是找出程序中隐藏的故障,校正那些不正常的指令,使程序能够正常工作. 程序的调试有几种不同的级别.最高级别当然是编程人员通过自己肉眼观察和推断,找出那些有毛病的代码并修改之.最低级别是对汇编代码进行调试.由于汇编语言代码的复杂.冗长与不直观.在汇编级对程序进行调试是一件比较费力的事.但UNIX得开发环境提供了汇编级的

UNIX系统管理:sdb的启动

首先来看看在哪些情况下需要对程序进行调试. 第一种情况(这是大多数用户都会碰到的),程序在运行过程中忽然跳了出来,屏幕上显示一个xxxx-core dumped消息,然后Shell提示符就又显示出来了,其中xxxx表示出错原因.这种情况的出现一般是系统核心认为进程的执行出现了异常,如进程试图去访问一块不允许它访问的存储区域(Memory Fault,Segmentation Fault);或者扫描某个无终止符的字符串(Bus http://www.aliyun.com/zixun/aggrega

怎么使用vc.net调用已打开的应用程序执行一段命令文件

问题描述 好像vc下的winexec,vb中的shell命令都可以新打开一个应用程序,执行一段文本文件写的命令.现在我的问题是该应用程序已经打开,用什么命令让它执行文本文件写的命令,而且执行完这些命令后能向我的c++程序传递消息,表示执行完.这我现在在做关于两个应用程序的二次开发,需要在这两个应用程序之间不断的交换数据,这个问题就是要解决的一个关键问题,困惑了好久都没解决,还请各位高手帮忙 解决方案 解决方案二:执行文本文件写的命令,而且执行完这些命令后能向我的c++程序传递消息,表示执行完.-

linux 下 java程序执行shell命令 跪求!!!!

问题描述 一个Java程序在Linux下面执行shell命令来创建用户为什么总是执行不成功呢.希望大家帮帮小弟!!!Stringuser="张三";Stringcellphone="5858678";Stringcommandstr="useradd-glingyun"+user+";echo""+cellphone+""|passwd--stdin"+user+""

UNIX系统管理:用户登录和普通命令定位

完成了这一章,你能够做以下事情: 登录UNIX系统退出UNIX系统使用联机帮助查找命令用法理解shell命令的格式用一些简单的命令来鉴别系统用户用一些简单的命令来与系统中的用户通信用一些简单的命令来实现多种功能并输出结果 1一个典型的终端会话过程 为了能和计算机通信,需要有以下条件:一个具有完全ASCII字符集的终端 一条连接计算机的数据通信线路 一个登录ID(用户身份确认) 一个密码 一个终端会话过程开始于用户登录一个系统认可的终端,结束于退出信号(logoff),计算机会在你登录期间响应你的

Windows 服务控制管理器通信的命令行程序_应用技巧

SC 是用于与服务控制管理器通信的命令行程序. 用法: sc <server> [command] [service name] <option1> <option2>... 选项 <server> 的格式为 "\\ServerName" 可以键入 "sc [command]"以获得命令的进一步帮助 命令: query-----------查询服务的状态, 或枚举服务类型的状态. queryex---------查询服