unix下sdb命令详解( 二 )


这里1111为待调试进程的进程号,用户可以用PS命令得到 。系统在/proc目录下用文件的形式保存了每一个活动进程的信息,而文件名正好就是相应的进程号 。
指定的进程将在执行时遇到第一个系统调用或调用sdb后收到某个软中断信号时暂停其运行,我们就可以在sdb中检查变量的值、设置断点、恢复执行,等等 。在退出sdb时,控制又返回程序,执行进程又从其原停止的地方继续执行 。
第四种情况,一般情况下当被调试的活动进程在收到某个软中断信号时sdb会停止该进程 。为了防止这一点,可以使用-s 选项 。例如:
$ sdb -s 14 myprog
将告诉sdb不要因为软中断信号14(闹钟报警信号)而使进程的执行停止 。此时该信号被传给相应进程 。在程序接收并处理多个软中断信号的情况下,可以使用多个-s选项 。
在sdb命令行中还有其他一些选项,对此我们不再一一列举,读者可以参考命令帮助 。
在使用上述方法之一进入sdb之后,便可以进行在前一节中提到的各种操作,如显示或设置变量值、函数调用关系、控制语句的执行等 。下一节我们将详细讨论完成这些操作的方法 。
【unix下sdb命令详解】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 TestInput0x7
0x804482 myprog.c:13 TestInput0x42
在设置完断点之后要将其删除,可以使用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*
sdb将在main()函数中设置第一个断点处停下来并显示该行的语句 。r后面给出的是传给可执行程序myprog的两个参数 。因此上述命令同在shell提示符下输入:
$ myrprog 111 2
是相同的 。不同的只是在sdb中程序的执行会在断点处停下来 。

推荐阅读